如何在Windows上使用c ++在不带<dirent.h>的情况下获取具有特定扩展名的所有文件的列表。dirent.h在Visual Studio 2019上不起作用,还有其他方法可以获取目录中所有文件的列表吗?
例如列表
file.txt
secode.txt
hello.txt
h.txt
如果不是的话,我可以在Visual Studio 2019中工作吗?
如果使用C ++ 17,也可以在没有增强的情况下轻松实现。我用VS2019测试了以下示例。
请参见下面的示例。阅读完整的文件列表只是一小段内容:
std::vector fileList (fs::directory_iterator(startPath), {});
范围构造器在std::vector
。
我们可以定义没有模板参数的std :: vector。编译器可以从给定的函数参数中推导出自变量。此功能称为CTAD(“类模板参数推导”)。
此外,您可以看到我没有明确使用“ end()”迭代器。
该迭代器将从空括号括起来的初始值设定项列表中以正确的类型构造,因为由于std :: vector构造函数要求与第一个参数的类型相同,因此可以推导该迭代器。
当然,您也可以使用 fs::recursive_directory_iterator
找到扩展名非常简单。您当然也可以检查其他文件/路径属性。没问题。
请查看完整的工作示例:
#include <iostream>
#include <filesystem>
#include <vector>
#include <iterator>
namespace fs = std::filesystem;
int main() {
// The start path
const fs::path startPath{ "C:\\temp\\" };
// And the extension to look for
const std::string extension{ ".txt" };
// Get all directory entries into our fileList vector
std::vector fileList (fs::directory_iterator(startPath), {});
// Evaluate. Go through all directory entries
for (const fs::directory_entry& de : fileList) {
// Get path as string
std::string p{ de.path().string() };
// Check if it ends with the given extension
if (p.substr(p.size() - extension.size(), extension.size()) == extension)
std::cout << p << "\n";
}
return 0;
}
使用std::transform
和的其他解决方案std::copy_if
:
#include <iostream>
#include <filesystem>
#include <vector>
#include <iterator>
namespace fs = std::filesystem;
int main() {
// The start path
const fs::path startPath{ "C:\\temp\\" };
// And the extension to look for
const std::string extension{ ".txt" };
std::vector<std::string> files{};
// Get all path names as string
std::transform(fs::directory_iterator(startPath), {}, std::back_inserter(files), [](const fs::directory_entry & de) { return de.path().string(); });
// Output all files with extension
std::copy_if(files.begin(), files.end(), std::ostream_iterator<std::string>(std::cout,"\n"), [&extension](const std::string & p) {
return (p.substr(p.size() - extension.size(), extension.size()) == extension); });
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句