程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用 C++ 打印 C:\ 中的所有文件路径大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用 C++ 打印 C:\ 中的所有文件路径?

开发过程中遇到使用 C++ 打印 C:\ 中的所有文件路径的问题如何解决?下面主要结合日常开发的经验,给出你关于使用 C++ 打印 C:\ 中的所有文件路径的解决方法建议,希望对你解决使用 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_iteratorstd::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,请注明来意。