从目录中读取文件名

Ton*_*y R 16 c++ file-io file

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

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

chr*_*ish 18

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


Joh*_*n T 12

我想你正在寻找FindFirstFile()FindNextFile().

  • 注意:这些函数是Microsoft API的一部分,不是C++标准的一部分. (5认同)

drb*_*rby 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);
}
Run Code Online (Sandbox Code Playgroud)

这为您提供了一个包含目录中所有文件名的向量.它当然只适用于Windows.


JoãoAugusto回答中指出:

不要忘记检查后FindClose(hFind):

DWORD dwError = GetLastError();
if (dwError != ERROR_NO_MORE_FILES) 
{
  // Error happened        
}
Run Code Online (Sandbox Code Playgroud)

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


rob*_*les 8

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");
}
Run Code Online (Sandbox Code Playgroud)

可能的输出:

sandbox/a
sandbox/file1.txt
sandbox/file2.txt
Run Code Online (Sandbox Code Playgroud)


sla*_*acy 6

您还可以使用POSIX opendir()和readdir()函数.请参阅本手册页,其中还包含一些很好的示例代码.