c++ - 使用 Visual Studio C++ 按名称搜索目录中的文件

标签 c++ visual-studio file search directory

我正在尝试创建一个程序,我可以使用 Visual Studio C++ 在我的 PC 上的目录中搜索一些文件。 由于我对此不是很有经验,所以我在另一个答案中找到了这段代码(如下),但找不到对该代码的任何解释。 我很难弄明白,非常感谢任何可能的帮助。

如果有其他方法可以做到这一点,我很乐意知道如何做。 谢谢!

" 现在您可以获得文件名。只需比较一个文件名即可。

 while ((dirp = readdir(dp)) != NULL) {
       std::string fname = dirp->d_name;
       if(fname.find("abc") != std::string::npos)
          files.push_back(fname);
    }

也可以使用scandir函数注册过滤函数。

 static int filter(const struct dirent* dir_ent)
    {
        if (!strcmp(dir_ent->d_name, ".") || !strcmp(dir_ent->d_name, "..")) 
    return 0;
        std::string fname = dir_ent->d_name;

        if (fname.find("abc") == std::string::npos) return 0;

        return 1;
    }


    int main()
    {
        struct dirent **namelist;

        std::vector<std::string> v;
        std::vector<std::string>::iterator  it;

        n = scandir( dir_path , &namelist, *filter, alphasort );

        for (int i=0; i<n; i++) {
            std::string fname = namelist[i]->d_name;

            v.push_back(fname);

            free(namelist[i]);
        }
        free(namelist);

    return 0;
    }

最佳答案

更好的方法可能是使用新的 std::filesystem library . directory_iterators允许您浏览目录的内容。由于它们只是迭代器,您可以将它们与标准算法结合使用,例如 std::find_if搜索特定条目:

#include <filesystem>
#include <algorithm>

namespace fs = std::filesystem;

void search(const fs::path& directory, const fs::path& file_name)
{
    auto d = fs::directory_iterator(directory);

    auto found = std::find_if(d, end(d), [&file_name](const auto& dir_entry)
    {
        return dir_entry.path().filename() == file_name;
    });

    if (found != end(d))
    {
        // we have found what we were looking for
    }

    // ...
}

我们首先为我们要搜索的目录创建一个directory_iterator d。然后我们使用 std::find_if() 遍历目录的内容并搜索与我们要查找的文件名相匹配的条目。 std::find_if() 需要一个函数对象作为应用于每个访问元素的最后一个参数,如果该元素与我们正在寻找的元素匹配,则返回 truestd::find_if() 将迭代器返回到此谓词函数为其返回 true 的第一个元素,否则返回结束迭代器。在这里,我们使用 lambda 作为谓词,当我们正在查看的目录条目路径的文件名部分与所需文件名匹配时,它返回 true。之后,我们将 std::find_if() 返回的迭代器与结束迭代器进行比较,看看我们是否找到了一个条目。如果我们确实找到了条目,*found 将计算为 directory_entry代表相应的文件系统对象。

请注意,这将需要最新版本的 Visual Studio 2017。不要忘记将语言标准设置为 /std:c++17/std:c++项目属性(C++/语言)中的最新

关于c++ - 使用 Visual Studio C++ 按名称搜索目录中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51378530/

相关文章:

c++ - C/C++ 查找指针

c# - C# 中的 File 和 FileInfo 有什么区别?

visual-studio - 将库的调试和发布版本添加到 VS 解决方案

visual-studio - 在 Windows 8 上安装 Visual Studio 2005

.net - "PublicKeyToken <..> is not a valid extension type."错误?

java - 如何在java中从命令行启动msaccess数据库?

java - 我如何才能播放 .wav 声音?

c++ - 使用模板的条件 typedef 的更清洁替代方案

c++ - C和C++的所有者是谁?

c++ - Qt : How to cast QTableRowItem to Object?