如何在 Windows 上获取带有 c++ 且没有 <dirent.h> 的特定扩展名的所有文件的列表
How do i get a list of all files with a specific extension with c++ without <dirent.h> on windows
如何在Windows上使用c ++获取具有特定扩展名的所有文件的列表,而无需
例如,列表将是
file.txt
secode.txt
hello.txt
h.txt
如果没有,那么我可以让dirent.h在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;
}
如果你有 boost,你可以使用 boost::filesystem 下面是在 JPG 扩展中获取所有图像的示例。
#include <boost/filesystem.hpp>
#include <boost/filesystem/path.hpp>
#include <vector>
#include <string>
using namespace boost::filesystem;
using std::string;
using std::vector;
void GetAllImageFromDir(path& dir, vector<path>& all_dir_images)
{
string str(".jpg"); // store paths,
vector<path> all_dir_files;
std::copy(directory_iterator(dir), directory_iterator(), back_inserter(all_dir_files));
for (int k = 0; k < all_dir_files.size(); ++k )
{
if (all_dir_files[k].filename_is_dot() || all_dir_files[k].filename_is_dot_dot() || !is_regular_file(all_dir_files[k]))
{
continue;
}
else
{
if (is_regular_file(all_dir_files[k]))
{
string extension = boost::filesystem::extension(all_dir_files[k].string());
if (extension.compare(str) == 0)
{
all_dir_images.push_back(all_dir_files[k]);
}
}
}
}
}
相关文章:
- C++中的VLA,扩展名为std=C++11
- 如何按文件扩展名引用文件夹中的文件
- VSCode 中带有 C/C++ 扩展名的多行注释缩进错误
- 为什么我无法打开/读取从 Python 调用的 C 扩展名中的 txt 文件?
- 使用Boost文件系统C++将具有特定扩展名的文件的名称保存在特定文件夹中
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- Visual Studio Code "variable " u8 的 C/C++ 扩展名 " " 不是类型名称"
- Makefile by ocaml 和 cpp 扩展名
- CMake 不编译具有非标准扩展名的文件
- Visual Studio 2019 - 设置文件类型的默认扩展名
- 如何在 Windows 上获取带有 c++ 且没有 <dirent.h> 的特定扩展名的所有文件的列表
- 谁能告诉我,程序中的错误是什么?该程序仅用于获取文件扩展名
- 如何在 vscode 扩展名中检索 C/C++ 文件的编译命令
- 通过cMake使用具有自定义文件扩展名的共享库
- 如何在 CMake 中"override"文件的按扩展名类型
- 在另一个字符串中插入文件扩展名之前的字符串
- 如何在不使用文件扩展名的情况下使用命令行参数打开C++中的文本文件?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 使用FindFirstFile和FindNextFile递归查找具有特定扩展名的文件
- 将源文件扩展名从 .m 更改为 .mm 在屏幕保护程序项目的 Xcode 9.3 中失败