大佬教程收集整理的这篇文章主要介绍了使用 C++ 打印 C:\ 中的所有文件路径,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在 C: 中打印所有文件路径。 但我发现我收到了权限错误。
voID getAllfilesInDirectory(wString directoryPath,vector<wString> &files) { for (filesystem::directory_entry directory : filesystem::directory_iterator(directoryPath)) { if (GetfileAttributesW(directory.path().wString().c_str()) == file_ATTRIBUTE_SYstem) conTinue; //checking if Directory.path is a file or a directory if (GetfileAttributesW(directory.path().wString().c_str()) == file_ATTRIBUTE_norMAL) { files.push_BACk(directory.path().wString()); wcout << "The path is " << directory.path().wString() << endl; conTinue; } try { for (filesystem::directory_entry file : filesystem::recursive_directory_iterator(directory)) { if (GetfileAttributesW(file.path().wString().c_str()) == file_ATTRIBUTE_DIRECTORY) { conTinue; } wcout << "The path of the file is " << file.path().wString() << endl; files.push_BACk(file.path().wString()); } } catch (exception &E) { wcout << "There is exception " << e.what() << " and the directory path is: " << directory.path().wString() << endl; } } }
@H_489_7@当我给函数一个常规目录(不是具有特权的目录)时,我的代码正在工作。
但是当我给他“C:\”时,他在打印了一个小路径后退出了。
如果有人把他打印C盘所有路径的方法贴出来就好了。
谢谢!
解决方法
您在评论中说:
我希望我的代码会忽略他无权访问的文件
std::filesystem::directory_iterator
和std::filesystem::recursive_directory_iterator
都有一个构造函数,它接受一个std::filesystem::directory_options
枚举作为输入,它有一个skip_permission_denied
项可用于此目的,例如:void getAllFilesInDirectory(const wString &directoryPath,vector<wString> &files) { for (filesystem::directory_entry directory : filesystem::directory_iterator(directoryPath,filesystem::directory_options::skip_permission_denied)) { ... for (filesystem::directory_entry file : filesystem::recursive_directory_iterator(directory,filesystem::directory_options::skip_permission_denied)) { ... } } }
@H_489_7@
附带说明,您可能需要考虑添加命名空间别名来缩短那些限定名称,例如:
namespace fs = std::filesystem; for (fs::directory_entry directory : fs::directory_iterator(directoryPath,fs::directory_options::skip_permission_denied)) { ... for (fs::directory_entry file : fs::recursive_directory_iterator(directory,fs::directory_options::skip_permission_denied)) { ... } }
@H_489_7@另外,您对
GetFileAttributesW()
的使用是错误的。您没有检查错误,也没有考虑到文件夹和文件可以(并且通常确实)分配了多个属性。在测试特定属性时使用&
(AND) 运算符。并且测试FILE_ATTRIBUTE_NORMAL
属性并不是区分文件和文件夹的正确方法。改为测试FILE_ATTRIBUTE_DIRECTORY
属性是否存在。试试这个:
namespace fs = std::filesystem; void getAllFilesInDirectory(const wString &directoryPath,vector<wString> &files) { for (fs::directory_entry directory : fs::directory_iterator(directoryPath,fs::directory_options::skip_permission_denied)) { DWORD attrs = GetFileAttributesW(directory.path().wString().c_str()); if (attrs == INVALID_FILE_ATTRIBUTES) { DWORD err = GetLastError(); wcerr << "Error " << err << " getTing attributes for path " << directory.path().wString() << endl; conTinue; } if (attrs & FILE_ATTRIBUTE_SYSTEM) conTinue; //checking if Directory.path is a file or a directory if (attrs & ~FILE_ATTRIBUTE_DIRECTORY) { files.push_BACk(directory.path().wString()); wcout << "The path is " << directory.path().wString() << endl; conTinue; } try { for (fs::directory_entry file : fs::recursive_directory_iterator(directory,fs::directory_options::skip_permission_denied)) { attrs = GetFileAttributesW(file.path().wString().c_str()); if (attrs == INVALID_FILE_ATTRIBUTES) { DWORD err = GetLastError(); wcerr << "Error " << err << " getTing attributes for path " << file.path().wString() << endl; conTinue; } if (attrs & FILE_ATTRIBUTE_DIRECTORY) conTinue; wcout << "The path of the file is " << file.path().wString() << endl; files.push_BACk(file.path().wString()); } } catch (const exception &E) { wcout << "There is exception " << e.what() << " and the directory path is: " << directory.path().wString() << endl; } } }
@H_489_7@大佬总结
以上是大佬教程为你收集整理的使用 C++ 打印 C:\ 中的所有文件路径全部内容,希望文章能够帮你解决使用 C++ 打印 C:\ 中的所有文件路径所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。