从目录中读取文件名

时间:2009-03-04 04:15:59

标签: c++ file file-io

我想知道在C ++中是否有一种简单的方法可以从包含许多文件的文件夹中读取大量文件名。如果有人想知道的话,它们都是位图。

我对Windows编程知之甚少,所以我希望可以使用简单的C ++方法来完成。

8 个答案:

答案 0 :(得分:17)

Boost提供了一个basic_directory_iterator,它提供了一个符合C ++标准的输入迭代器,它可以访问目录的内容。如果您可以使用Boost,那么这至少是跨平台代码。

答案 1 :(得分:12)

我认为您正在寻找FindFirstFile()FindNextFile()

答案 2 :(得分:9)

快速查看我的代码段目录。发现这个:

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        
}

如果在网络上扫描,这一点尤为重要。

答案 3 :(得分:6)

您还可以使用POSIX opendir()和readdir()函数。请参阅this manual page,其中还有一些很好的示例代码。

答案 4 :(得分:4)

我建议您使用原生Win32 FindFirstFile()FindNextFile()函数。这些功能可让您完全控制搜索文件的方式。这是简单的C API,并不难使用。

另一个优点是,由于C / C ++库层,Win32错误不会被隐藏或更难以获取。

答案 5 :(得分:4)

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

答案 6 :(得分:0)

另一种选择是 -

  1. system("dir | findstr \".bmp\" > temp.txt ");
  2. 现在逐行读取temp.txt以获取所有文件名。

答案 7 :(得分:0)

为什么不使用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;
}