如何一步一步地遍历目录树



我发现了很多遍历目录树的例子,但我需要一些不同的东西。我需要一个带有一些方法的类,每次调用都会从目录中返回一个文件,并逐渐遍历目录树。我该怎么做?我正在使用函数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、while或for。。。我需要某种迭代器,它可以存储起来供以后使用,当我中断浏览时,它可以从最后一个文件继续,但理想情况下只能使用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));

以下是在Windows平台上(使用MFC框架)使用本机C++的方法:

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等。您也可以将其作为参数传递给此函数,使其更通用。

使用正确的工具。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";
  }
}

如果您不关心文件是否与某个模式匹配,请删除整个regex业务。

编辑:

你能解释一下为什么直接使用API调用是不好的吗?

  1. 它很难看,很难阅读,甚至很难纠正
  2. 它根本不便携,最重要的是
  3. 在使用raw-winapi时,可能需要处理一百万个角落的情况。Boost已经被写了几百次了,并且经过了认真的代码审查,所以采取保存路线,不要重新发明轮子

从本质上讲,winapi大约有20年的历史;在世界其他地方已经有很多可用性改进。除非你有充分的理由,否则我会尝试通过使用公共库(如Boost)来尽可能多地抽象它。

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

基本上需要在树上行走而不做/同时,同时或为了。。。我需要某种迭代器,它可以被存储以供以后使用

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

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

您不必在这些计算机上安装boost。Boost::文件系统可以舒适地静态链接;此外,老派windows的方法只是将boost_filesystem*.dllboost_system*.dll与二进制文件一起交付。然而,如果您的目标是一个包含所有所需函数的可执行文件,那么无论如何,您都会选择静态链接,所以这绝对没有问题。

相关内容

  • 没有找到相关文章

最新更新