如何从磁盘中获取所有文件?



我必须创建一个磁盘上所有文件的矢量,从根目录("C:/")开始。我使用了文件系统库和recursive_directory_iterator,但是当程序到达一些只有系统才能访问的系统目录时,会抛出filesystem::filesystem_error。

#include <filesystem>
#include <iostream>
#include <vector>
using namespace std;
namespace fs = std::filesystem;
vector<fs::path> get_all_files_from_disk(fs::path path,vector<fs::path>* all_files = NULL) {
if (all_files == NULL)
all_files = new vector<fs::path>();
try {
for (auto dir : fs::directory_iterator(path)) {         
if (dir.is_directory())
*all_files = get_all_files_from_disk(dir, all_files);
else
all_files->push_back(dir.path());
}
}
catch (fs::filesystem_error e) {
cout << "error";
}
return *all_files;
}
vector<fs::path> getAllFilesFromDisk(fs::path path) {
vector<fs::path> all_files;
for (auto dir : fs::recursive_directory_iterator(path)) {
if (!dir.is_directory())
all_files.push_back(dir.path());
};
return all_files;
};
int main() {
setlocale(LC_ALL, "");
fs::path path("C:/");
vector<fs::path> a = get_all_files_from_disk(path);
vector<fs::path> b = getAllFilesFromDisk(path);
}

第一个算法没有崩溃,但是执行了很长时间(它执行了大约40分钟),但是当输出显示vector的所有元素为空时,由于某种原因,没有根目录,它工作得很好。第二个程序由于开头所述的原因而崩溃。

:请帮忙好吗?

可能存在底层文件系统拒绝您读取某些目录(例如特殊系统目录)的权限的问题。

那可能是你的迭代器失败的原因。

如果您阅读了这里的CPP参考中的std::filesystem::recursive_directory_iterator,那么您可以在构造函数5的描述中看到,您可以设置一个标志来忽略不可访问的目录。请在这里阅读有关标志skip_permission_denied

仍然会运行一段时间,因为很多很多目录是从根目录开始的。请打开优化开关

示例代码:

#include <filesystem>
#include <iostream>
#include <vector>
using namespace std;
namespace fs = std::filesystem;
vector<fs::path> getAllFilesFromDisk(fs::path path) {
vector<fs::path> all_files;
for (auto dir : fs::recursive_directory_iterator(path, fs::directory_options::skip_permission_denied)) {
if (!dir.is_directory())
all_files.push_back(dir.path());
};
return all_files;
};
int main() {
setlocale(LC_ALL, "");
fs::path path("C:/");
vector<fs::path> b = getAllFilesFromDisk(path);
}

最新更新