我想检索 C:/ 驱动器中的所有文件/目录路径(嵌套),至少如果它们当前未使用或我有权检索的地方。
为了递归地做到这一点,我使用
recursive_directory_iterator
了 from std::filesystem
。
由于以下原因,我设法避免了权限错误std::filesystem::directory_options::skip_permission_denied
但是,当我的程序进入C:/drivers时,我得到_Error _Sharing_violation (32) __std_win_error
了因为它试图访问的文件可能是打开的。
我添加了避免C:/Windows和C:/drivers的条件,但我想确保避免前面提到的错误。不幸的是,文件系统中没有选项可以防止此错误,例如skip_permission_denied
权限,或者我不知道。
这是我当前的代码:
fs::path rootPath = "C:";
fs::path exclPath = rootPath / "\\Windows";
fs::path drivrPath = rootPath / "\\drivers";
const std::filesystem::directory_options options = (std::filesystem::directory_options::skip_permission_denied);
for (fs::directory_entry p : std::filesystem::recursive_directory_iterator("C:\\", options))
{
string filePath = p.path().string();
// Vérification du type de l'objet
if (!fs::is_regular_file(p.path()) && filePath.find(drivrPath.string()) == string::npos && filePath.find(exclPath.string()) == string::npos)
{
cout << filePath << endl;
}
}
不注意!fs::is_regular_file(p.path())
,我手动更改它以测试和检索目录或文件。我得到两者的共享冲突错误。
经过一些测试后,我发现我的程序在检查C:\DumpStack.log.tmp时失败了。问题来自!fs::is_regular_file(p.path())
. 当我删除此验证时,该程序起作用了。现在,我不知道如何在不触发共享冲突的情况下检查对象类型