2017-09-11 149 views
0

我想写一个C++脚本,它使用C++ 17文件系统库递归地删除在任何给定根目录中找到的所有空目录让事情更清晰我将使用此代码示例中的cwd)。
所以,说我有以下目录结构:C:\Users\anrob\Pictures\SonyA100\2017\August\Week1\8-1-2017 我知道,在这条道路C:\Users\anrob\Pictures\SonyA100\2017\August\Week1\8-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
这里是我当前的代码(请注意,我使用的是Microsoft(R)C/C++优化编译器版本19.00.24225.1针对x64):C++ 17文件系统(在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; 
} 

当我编译并运行此代码,它不仅能消除一个空目录(即C:\Users\anrob\Pictures\SonyA100\2017\August\Week1\8-1-2017,而不是所有的也即将成为空目录。

+0

建议 - 我希望你你不关心的文件系统上测试去除目录。一个错误,一个错字等,你最终可能会删除一个重要的目录。 – PaulMcKenzie

+0

@PaulMcKenzie这是一个受控的环境。我试图做这个只是为了了解更多关于新的C++ 17文件系统库。一旦它起作用,我将在照片组织和编辑程序中实施它。但是,谢谢你的头,我很感激! –

+1

我希望在迭代文件/目录的时候删除文件/目录并不是一个好主意。也许尝试将空目录的路径复制到矢量中,然后在完成迭代时删除所有这些路径。 –

回答

0

所以,我决定尝试一次复制路径的路径载体,作为@BenjaminLindley建议。
它没有工作,再次...
然后,我决定再深入看the Filesystem library documentation
在仔细阅读文档后,我意识到我应该使用规范路径,并且我应该用反向迭代器遍历这个规范路径向量。
我的脚本现在像一个魅力,“递归地”删除所有空目录如预期。
我认为在这里分享我的解决方案是一个好主意,因为我真的无法找到任何明确的答案,我早先的问题。
我真的很感激,如果堆栈溢出社区可以upvote这个答案,甚至这个问题,因为我不认为我会成为唯一的人绊倒在这个问题上。
最后,这里是我的问题的解决方案:

#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

'命名空间fs = std :: experimental :: filesystem'会使事情变得更加可读。 – akim

+0

@Artemy Vysotsky我把所有的目录都放到了vector中,因为在删除一个父目录中的空目录之后,这个父目录也可能变成空的。这就是为什么我使用反向迭代器来检查目录是否为空,然后删除它们。由于reverse_directory_iterator函数遍历给定路径,我不得不使用反向迭代器。 –