如何一步一步浏览目录树?

我发现了很多通过目录树的例子,但是我需要一些不同的东西。 我需要一个类的方法,每个调用从目录返回一个文件,并逐渐遍历目录树。 我怎样才能做到这一点? 我正在使用函数FindFirstFile,FindNextFile和FindClose,我是新手在c + +。 我有这样的东西…

例如,我有这个简单的目录树

Parent(folder)\ file1.txt file2.txt Child(folder)\ file3.txt file4.txt 

我需要一个类的方法,例如getNextFile(),第一次调用返回file1.txt; 第二个调用返回file2.txt,第三个调用返回Child(文件夹),第四个调用返回file3.txt等等…

在重复的标志上编辑:我基本上需要走过树,而不做/ while,或者…我需要某种迭代器,它可以存储供以后使用,并可以从最后一个文件继续,当我中断浏览,但理想情况下只使用winapi电话

 WIN32_FIND_DATA fdFile; HANDLE hFind = NULL; if((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE) { return false; } do { //do some job with fdFile } while(FindNextFile(hFind, &fdFile)); 

Solutions Collecting From Web of "如何一步一步浏览目录树?"

使用正确的工具。 Boost可以随时随地使用,并具有您想要的方法。

来自http://rosettacode.org/wiki/Walk_a_directory/Recursively#C.2B.2B

 #include "boost/filesystem.hpp" #include "boost/regex.hpp" #include <iostream> using namespace boost::filesystem; int main() { path current_dir("."); // boost::regex pattern("a.*"); // list all files starting with a for (recursive_directory_iterator iter(current_dir), end; iter != end; ++iter) { std::string name = iter->path().filename().string(); if (regex_match(name, pattern)) std::cout << iter->path() << "\n"; } } 

删除整个正则表达式业务,如果你不关心你的文件是否符合某种模式。

编辑:

你能解释一下为什么直接使用API​​调用会很糟糕吗?

  1. 这是丑陋难读,更难以得到正确的,
  2. 它根本不是便携式的,最重要的是,
  3. 在使用原始的win api的时候,有一百万个角落案例需要处理。 Boost已经被这样做了几百次的人写过,并且经过了严格的代码审查,所以采取了保存路线,而不是重新发明轮子。

从本质上讲,winapi大约有二十年的历史, 在世界其他地方有很多可用性改进。 除非你有一个非常好的理由,否则我会尽量通过使用通用库(如Boost)尽可能多地抽象出它。

我认为这并不能解决我的问题,我编辑了原文,使其更清晰。

基本上需要走过树而不做/而while,或者…我需要某种迭代器,它可以存储供以后使用

这正是我的答案:在for循环中给你一个迭代器。 我不明白什么是不符合你的编辑规范。

另外,最好只使用WinAPI,因为它必须在Windows的不同计算机上工作,安装boost可能会成为问题。

您不必在任何这些计算机上安装boost。 Boost :: filesystem可以很好地静态链接; 此外,老派Windows的这种做法只是提供boost_filesystem*.dllboost_system*.dll以及你的二进制文件。 但是,如果你的目标是一个包含所有需要的函数的单个可执行文件,那么无论如何你都要进行静态链接,所以这绝对没有问题。

下面是在Windows平台上使用MFC的原生C ++方法(使用MFC框架):

 void ListFiles(const CString& sPath) { CFileFind finder; CString sWildcard(sPath); sWildcard += _T("\\*.*"); BOOL bWorking = finder.FindFile(sWildcard); while (bWorking) { bWorking = finder.FindNextFile(); if (finder.IsDots()) continue; if (finder.IsDirectory()) { CString sFilePath = finder.GetFilePath(); // TODO: do stuff here ListFiles(sFilePath); } } finder.Close(); } 

您可以更改通配符字符串以指定特定文件,如* .txt等。您也可以将其作为参数传递给此函数,以使其更通用。