如何使用文件系统列出目录中具有给定扩展名的所有文件?

Fre*_*ios 0 c++ visual-studio-2015

由于filesystem存在于编译器的实验部分并将到达最新版本的 C++,如何从使用它的目录中列出与给定扩展名匹配的文件?

Vit*_*meo 7

您可以std::experimental::filesystem::directory_iterator手动使用和过滤:

for(const auto& p : fs::directory_iterator("some_directory"))
{
    if(p.path().extension() == ".txt")
    { 
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以创建一个不错的包装器,如下所示:

template <typename TF>
void for_files_with_extension(std::string_view dir, std::string_view ext, TF&& f)
{
    for(const auto& p : fs::directory_iterator(dir))
    {
        if(p.path().extension() == ext)
        { 
            f(p);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以这样使用:

for_files_with_extension("/home/someone/", ".txt", 
    [](const auto& p){ std::cout << "Found text file at " << p << "\n"; });
Run Code Online (Sandbox Code Playgroud)

  • @PanagiotisKanavos:问题询问如何**列出**匹配特定扩展名**与`filesystem`**的所有文件。建议使用非便携式解决方案(例如 Win32 API)超出了问题的范围,并且在我看来,与使用标准化 TS 或 `boost::filesystem` 相比,这是一种较差的建议。 (4认同)
  • @PanagiotisKanavos:迭代所有内容并按扩展名过滤是**“匹配特定扩展名”** 的一种方式。它是最有效的一种吗?否。它是否回答了问题,满足了 OP 选择的约束?**是的。** (4认同)
  • 请注意,OP 确认了 `filesystem` 的实验状态:*“因为文件系统存在于编译器的实验部分中,并且将出现在最新版本的 C++ 中......”* (2认同)