【发布时间】:2010-10-11 04:29:03
【问题描述】:
我想知道 C++ 中是否有一种简单的方法可以从包含许多文件的文件夹中读取多个文件名。如果有人想知道,它们都是位图。
我对 Windows 编程了解不多,所以我希望可以使用简单的 C++ 方法来完成。
【问题讨论】:
我想知道 C++ 中是否有一种简单的方法可以从包含许多文件的文件夹中读取多个文件名。如果有人想知道,它们都是位图。
我对 Windows 编程了解不多,所以我希望可以使用简单的 C++ 方法来完成。
【问题讨论】:
我认为您正在寻找 FindFirstFile() 和 FindNextFile()。
【讨论】:
我建议您可以使用本机 Win32 FindFirstFile() 和 FindNextFile() 函数。这些使您可以完全控制搜索文件的方式。这是简单的 C API,不难使用。
另一个优点是 Win32 错误不会被隐藏或由于 C/C++ 库层而更难发现。
【讨论】:
您还可以使用 POSIX opendir() 和 readdir() 函数。请参阅this manual page,其中也有一些很棒的示例代码。
【讨论】:
Boost 提供了一个basic_directory_iterator,它提供了一个符合 C++ 标准的输入迭代器,它可以访问目录的内容。如果你可以使用 Boost,那么这至少是跨平台的代码。
【讨论】:
刚刚快速浏览了我的 sn-ps 目录。找到这个:
vector<CStdString> filenames;
CStdString directoryPath("C:\\foo\\bar\\baz\\*");
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(directoryPath, &FindFileData);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
filenames.push_back(FindFileData.cFileName);
} while (FindNextFile(hFind, &FindFileData));
FindClose(hFind);
}
这为您提供了一个包含目录中所有文件名的向量。当然,它只适用于 Windows。
João Augusto 在answer 中注明:
别忘了在FindClose(hFind) 之后检查:
DWORD dwError = GetLastError();
if (dwError != ERROR_NO_MORE_FILES)
{
// Error happened
}
如果在网络上扫描,这一点尤其重要。
【讨论】:
另一种选择是 -
system("dir | findstr \".bmp\" > temp.txt ");【讨论】:
为什么不使用glob()?
glob_t glob_result;
glob("/foo/bar/*",GLOB_TILDE,NULL,&glob_result);
for(unsigned int i=0;i<glob_result.gl_pathc;++i){
cout << glob_result.gl_pathv[i] << endl;
}
【讨论】:
C++17 包含了一种标准实现方式
http://en.cppreference.com/w/cpp/filesystem/directory_iterator
#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
fs::create_directories("sandbox/a/b");
std::ofstream("sandbox/file1.txt");
std::ofstream("sandbox/file2.txt");
for(auto& p: fs::directory_iterator("sandbox"))
std::cout << p << '\n';
fs::remove_all("sandbox");
}
可能的输出:
sandbox/a
sandbox/file1.txt
sandbox/file2.txt
【讨论】: