2017-09-11 17 views
0

C++ 17ファイルシステムライブラリを使用して任意のルートディレクトリにある空のディレクトリをすべて再帰的に削除するC++スクリプトを作成しようとしています。私はこのコードサンプルでcwdを使用します)。 C:\Users\anrob\Pictures\SonyA100\2017\August\Week18-1-2017空のディレクトリしか持っていない、と私たちはC:\Users\anrob\Pictures\SonyA100\2017\August\Week1\8-1-2017を削除した後C:\Users\anrob\Pictures\SonyA100\2017\August\も空Week1ディレクトリが、何もないだろう、C:\Users\anrob\Pictures\SonyA100\2017\August\Week1\8-1-2017 そして、私はこのパスにC:\Users\anrob\Pictures\SonyA100\2017\August\Week1\8-1-2017が空であることを知っている:
だから、私は次のディレクトリ構造を持っていると言います。C++ 17 filesystem(実験的/ Windowsのファイルシステム)すべての空のディレクトリを再帰的に削除します

#include <experimental/filesystem> 
int main() { 
    std::experimental::filesystem::path top = 
std::experimental::filesystem::current_path(), 
    dir_path; 
    for (auto& p: 
std::experimental::filesystem::recursive_directory_iterator(top)) { 
     dir_path = p.path(); 
     while (std::experimental::filesystem::is_directory(dir_path) && 
     std::experimental::filesystem::is_empty(dir_path)) { 
      std::experimental::filesystem::remove(dir_path); 
      dir_path = dir_path.parent_path(); 
     } 
    } 
    return 0; 
} 

私がコンパイルし、このコードを実行し、それは一つだけを削除します。
はここに私の現在のコード(私はx64のために、Microsoft(R)C/C++最適化コンパイラバージョン19.00.24225.1を使っていることに注意してください)です空のディレクトリ(すなわち、C:\Users\anrob\Pictures\SonyA100\2017\August\Week1\8-1-2017はなく、すべてのものすぐツーなる空のディレクトリ。

+0

アドバイス - 私はあなたが気にしないファイルシステム上のディレクトリの削除をテストしている願っています:
最後には、ここで問題に私のソリューションです。 1つのバグ、1つのタイプミスなどがあり、重要なディレクトリを消去する可能性があります。 – PaulMcKenzie

+0

@PaulMcKenzie管理された環境です。私は新しいC++ 17ファイルシステムライブラリの詳細を学ぶためにこれをやろうとしています。それがうまくいけば、私は写真の整理と編集のプログラムにそれを実装するつもりです。しかし頭のおかげでありがとう、私はそれを感謝する! –

+1

ファイル/ディレクトリを繰り返し処理している間にファイルやディレクトリを削除するのは良い考えではないと思います。たぶん、空のディレクトリのパスをベクトルにコピーしてから、繰り返しを終えたら、すべて削除してください。 –

答えて

0

だから、私は@BenjaminLindleyが示唆したように、パスのベクトルへのパスをコピーする1つのより多くの時間を試してみることにした。
それはもう一度動作しませんでした...
その後、もう一度深く見てみることにしましたthe Filesystem library documentation
ドキュメントを徹底的に読んだ後で、標準パスを使用する必要があり、逆方向イテレータを使用して正規パスのこのベクトルを反復処理する必要があることを認識しました。
私のスクリプトは、魅力的なように機能し、空のディレクトリをすべて「再帰的に」削除します。
私の以前の質問にはっきりと答えが見つからなかったので、ここで私の解決策を共有することをお勧めします。
Stack Overflowコミュニティがこの回答をアップヴォートすることができれば、私は本当に感謝します。なぜなら、私はこの問題を偶然見つけられないと思うからです。

#include <experimental/filesystem> 
#include <vector> 
int main() { 
    std::experimental::filesystem::path top = std::experimental::filesystem::current_path(); 
    std::experimental::filesystem::path dir_path; 
    std::vector<std::experimental::filesystem::path> directories; 
    for (auto& p: std::experimental::filesystem::recursive_directory_iterator(top)) { 
     dir_path = p.path(); 
     if (std::experimental::filesystem::is_directory(dir_path)) { 
      directories.push_back(std::experimental::filesystem::canonical(dir_path)); 
     } 
    } 
    for (std::vector<std::experimental::filesystem::path>::reverse_iterator rit = directories.rbegin(); rit != directories.rend(); ++rit) { 
     if (std::experimental::filesystem::is_empty(*rit)) { 
      std::experimental::filesystem::remove(*rit); 
     } 
    } 
    return 0; 
} 
+0

ディレクトリが空でない場合、なぜそれをディレクトリにプッシュしますか? –

+0

'namespace fs = std :: experimental :: filesystem'は物事をより見やすくするでしょう。 – akim

+0

@Artemy Vysotsky 1つの親ディレクトリ内の空のディレクトリを削除した後、この親ディレクトリも空になる可能性があるため、すべてのディレクトリをベクトルにプッシュします。そのため、逆のイテレータを使用してディレクトリが空であるかどうかを確認し、そうであれば削除します。 reverse_directory_iterator関数が与えられたパスを反復する方法のため、逆方向反復子を使用しなければなりませんでした。 –

関連する問題