windows 从目录读取文件名

niwlg2el  于 2022-12-24  发布在  Windows
关注(0)|答案(8)|浏览(229)

我想知道在C中是否有一种简单的方法可以从一个包含很多文件的文件夹中读取很多文件名。如果有人想知道的话,它们都是位图。
我不太了解Windows编程,所以我希望它可以用简单的C
方法完成。

n1bvdmb6

n1bvdmb61#

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

ijxebb2r

ijxebb2r2#

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
ulmd4ohb

ulmd4ohb3#

由于指定了Windows,
我想你要找的是FindFirstFile()FindNextFile()

xzabzqsa

xzabzqsa4#

刚刚在我的snippets目录中快速浏览了一下。找到了这个。它直接使用微软的Win32 API:

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        
}
  • 在网络上扫描时尤为重要。*
cngwdvgl

cngwdvgl5#

你也可以使用POSIX的opendir()和readdir()函数,参见this manual page,它也有一些很棒的示例代码。

yiytaume

yiytaume6#

因为你是在Windows上编程,我建议你使用Win32的FindFirstFile()FindNextFile()函数。这些函数给予你完全控制你如何搜索文件。这些都是简单的C API,并不难使用。
另一个优点是Win32错误不会被隐藏,也不会因为C/C++库层而变得更难找到。

dxxyhpgq

dxxyhpgq7#

另一个选择是-
1.第一个月
1.现在逐行读取temp.txt以获取所有文件名。

ego6inou

ego6inou8#

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

相关问题