如何使用文件系统列出目录中具有给定扩展名的所有文件? > 文件系统< /代码>存在于编译器的实验部分,并将在C++的最新版本中出现,如何使用它来列出与给定扩展名匹配的文件?

如何使用文件系统列出目录中具有给定扩展名的所有文件? > 文件系统< /代码>存在于编译器的实验部分,并将在C++的最新版本中出现,如何使用它来列出与给定扩展名匹配的文件?,c++,visual-studio-2015,C++,Visual Studio 2015,手动使用和过滤: for(const auto& p : fs::directory_iterator("some_directory")) { if(p.path().extension() == ".txt") { /* ... */ } } 您可以创建一个很好的包装器,如下所示: template <typename TF> void for_files_with_extension(std::string_view dir,

手动使用和过滤:

for(const auto& p : fs::directory_iterator("some_directory"))
{
    if(p.path().extension() == ".txt")
    { 
        /* ... */
    }
}
您可以创建一个很好的包装器,如下所示:

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);
        }
    }
}
模板
带有扩展名的文件无效(std::string\u view dir、std::string\u view ext、TF&&f)
{
for(const auto&p:fs::directory_迭代器(dir))
{
if(p.path().extension()==ext)
{ 
f(p);
}
}
}
可以这样使用:

for_files_with_extension("/home/someone/", ".txt", 
    [](const auto& p){ std::cout << "Found text file at " << p << "\n"; });
对于扩展名为“/home/someone/”、“.txt”的文件,
[](const auto&p){std::cout您可以手动使用和筛选:

for(const auto& p : fs::directory_iterator("some_directory"))
{
    if(p.path().extension() == ".txt")
    { 
        /* ... */
    }
}
您可以创建一个很好的包装器,如下所示:

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);
        }
    }
}
模板
带有扩展名的文件无效(std::string\u view dir、std::string\u view ext、TF&&f)
{
for(const auto&p:fs::directory_迭代器(dir))
{
if(p.path().extension()==ext)
{ 
f(p);
}
}
}
可以这样使用:

for_files_with_extension("/home/someone/", ".txt", 
    [](const auto& p){ std::cout << "Found text file at " << p << "\n"; });
对于扩展名为“/home/someone/”、“.txt”的文件,

[](const auto&p){std::cout这个问题还不清楚。为什么不使用Win32 API函数呢?你是在寻求一种可移植的方式吗?高效地查询文件取决于操作系统特定的实现来实现性能。逐个迭代文件将比@PanagiotisKanavos慢几个数量级:当存在标准实现?@PanagiotisKanavos:filesystem是TS,存在boost实现。建议在可能成为标准一部分的通用可移植解决方案存在时使用特定于平台的解决方案是错误的建议。@PanagiotisKanavos:OP明确要求使用实验性
文件系统的解决方案
库。问题还不清楚。为什么不使用Win32 API函数呢?你是在寻求一种可移植的方式吗?高效地查询文件取决于操作系统特定的实现,以获得性能。逐个迭代文件的速度将比@PanagiotisKanavos慢几个数量级:当存在标准实现?@PanagiotisKanavos:filesystem是TS,存在boost实现。建议在可能成为标准一部分的通用便携式解决方案存在时使用特定于平台的解决方案是错误的建议。@PanagiotisKanavos:OP明确要求使用实验性
文件系统的解决方案
库。这不是标准的,性能会非常差。想象一下,当只有1-2个匹配项时,过滤1000个文件。这也不会搜索子文件夹。问题是如何搜索,而不是如何遍历所有文件files@PanagiotisKanavos:该问题询问如何列出与文件系统
的特定扩展名匹配的所有文件>。建议使用不可移植的解决方案(如Win32 API)超出了问题的范围,而且在我看来,与使用标准化TS或
boost::filesystem
相比,建议的效果较差。请注意,OP承认
filesystem
的实验状态:因为文件系统存在于编译器的实验部分,并且将到达C++的最新版本……“正如您指出的”匹配特定扩展。“。不要对所有内容都进行迭代。使用一些只适合需求10%的标准类不是一个好主意,尤其是当您必须处理大量需求时data@PanagiotisKanavos:迭代所有内容并按扩展过滤是“匹配特定扩展”的一种方式。它是最有效的一个吗?不。它是否回答了问题,满足OP选择的约束条件?是的。这不是标准,性能将非常差。想象一下,当只有1-2个匹配项时,过滤1000个文件。这也不会搜索子文件夹。问题是如何搜索,而不是如何迭代所有文件files@PanagiotisKanavos:该问题询问如何列出与
文件系统
的特定扩展名相匹配的所有文件。建议使用不可移植的解决方案(如Win32 API)超出了问题的范围,并且在我看来,与使用标准化的TS或
boost::filesystem
相比,建议更差。请注意,OP承认exp《代码>文件系统< /代码>的“状态”:“由于文件系统存在于编译器的实验部分,将到达C++的最新版本……”正如您指出的“匹配特定扩展”。使用一些只适合需求10%的标准类不是一个好主意,尤其是当你必须处理大量的问题时data@PanagiotisKanavos:迭代所有内容并按扩展过滤是“匹配特定扩展”的一种方式.它是最有效的吗?不是。它是否回答了问题,满足OP选择的约束条件?是的。