web-dev-qa-db-ja.com

フォルダとすべてのファイル/サブディレクトリを削除します

C++ですべてのファイル/サブディレクトリ(再帰的削除)を含むフォルダーを削除するにはどうすればよいですか?

25
user95644

真剣に:

system( "rm -rf /path/to/directory" )

おそらくもっとあなたが探しているものですが、UNIX固有のものです:

/* Implement system( "rm -rf" ) */

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/syslimits.h>
#include <ftw.h>


/* Call unlink or rmdir on the path, as appropriate. */
int
rm( const char *path, const struct stat *s, int flag, struct FTW *f )
{
    int status;
    int (*rm_func)( const char * );

    switch( flag ) {
    default:     rm_func = unlink; break;
    case FTW_DP: rm_func = rmdir;
    }
    if( status = rm_func( path ), status != 0 )
        perror( path );
    else
        puts( path );
    return status;
}


int
main( int argc, char **argv )
{
    while( *++argv ) {
        if( nftw( *argv, rm, OPEN_MAX, FTW_DEPTH )) {
            perror( *argv );
            return EXIT_FAILURE;
        }
    }
    return EXIT_SUCCESS;
}
21
William Pursell

Boost.Filesystem からboost::remove_allを使用できます。

15
avakar

ftw()nftw()readdir()readdir_r()を使用して、ディレクトリをトラバースし、ファイルを再帰的に削除できます。
ただし、ftw()nftw()readdir()はどちらもスレッドセーフではないため、代わりにreaddir_r()をお勧めします。プログラムはマルチスレッド環境で実行されます。

4
zeekvfu

標準のC++には、これを行う手段がありません。オペレーティングシステム固有のコードまたはBoostなどのクロスプラットフォームライブラリを使用する必要があります。

1
anon

C++ 17以降、これに対する好ましい答えは使用することです

std::filesystem::remove_all(const std::filesystem::path& folder)

this に従って、フォルダの内容を再帰的に削除し、最後にフォルダを削除します。

0
Exagon