6

ディレクトリを反復処理していて、アイテムがいくつかの基準に一致すると、それを削除します。ループ内から安全に実行できますか、それともパスを配列に保存して後で削除する必要がありますか?

boost ::filesystemdocsに関連情報が見つかりませんでした。

4

2 に答える 2

8

boost :: filesystem :: directory_iteratorのドキュメントに添付されているメモの最初の部分を引用します(強調は私自身のものです):

ディレクトリ反復を実行するプログラムは、ディレクトリ反復子を逆参照することによって取得されたパスが実際に存在するかどうかをテストしたい場合があります。存在しないファイルへのシンボリックリンクである可能性があります。エントリの削除と名前の変更を目的としてディレクトリツリーを再帰的にウォークするプログラムでは、シンボリックリンクをたどらないようにすることができます。

ファイルを削除する目的でディレクトリを反復処理することは、公式にサポートされているユースケースであり、したがってイテレータが無効になることはないことが明らかになりました。また、そのメモの2番目の部分を引用します。

ディレクトリのdirectory_iteratorの構築後にファイルがディレクトリから削除または追加された場合、その後のイテレータのインクリメントによって、値が削除または追加されたディレクトリエントリであるイテレータが生成されるかどうかは指定されていません。ISO / IEC 9945 readdir_r()を参照してください。

これは、ディレクトリを反復処理しているときに削除されたファイルが表示されるかどうかについての非常に具体的なステートメントです。繰り返しになりますが、反復プロセス自体はどのような場合でも有効なままであることを理解しています。

ISO /IEC9945にも同様の表現があることに注意してください。

于 2013-08-22T18:38:24.287 に答える
1

Windowsではそれは本当ですが、削除後にイテレータが無効になるUbuntuを見つけたので、次のアクセスで例外がスローされます。

だから私はこのようなものを使うことになりました:

    recursive_directory_iterator end;
    for (recursive_directory_iterator itr(folderPath); itr != end; )
    {
        path filePath = *itr++;
        if (is_regular_file(filePath) && filePath.string().find(filter) != std::string::npos)
        {
            if (remove(filePath))
            {
                removedFilesCounter++;
            }
        }
    }
于 2018-01-08T09:16:45.077 に答える