【问题标题】:Read file names from a directory从目录中读取文件名
【发布时间】:2010-10-11 04:29:03
【问题描述】:

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

我对 Windows 编程了解不多,所以我希望可以使用简单的 C++ 方法来完成。

【问题讨论】:

标签: c++ file file-io


【解决方案1】:

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

【讨论】:

  • 注意:这些函数是 Microsoft API 的一部分,而不是 C++ 标准的一部分。
【解决方案2】:

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

另一个优点是 Win32 错误不会被隐藏或由于 C/C++ 库层而更难发现。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        刚刚快速浏览了我的 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 Augustoanswer 中注明:

        别忘了在FindClose(hFind) 之后检查:

        DWORD dwError = GetLastError();
        if (dwError != ERROR_NO_MORE_FILES) 
        {
          // Error happened        
        }
        

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

        【讨论】:

          【解决方案6】:

          另一种选择是 -

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 您忘记检查 glob() 是否返回零,以及使用 globfree() 释放分配的 glob_result。
            【解决方案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");
            }
            

            可能的输出:

            sandbox/a
            sandbox/file1.txt
            sandbox/file2.txt
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-11-02
              • 2015-04-22
              • 2019-03-22
              • 1970-01-01
              • 2016-01-06
              相关资源
              最近更新 更多