我找到了许多关于遍历目录树的示例,但我需要一些不同的东西。我需要一个带有一些方法的类,每个调用从目录返回一个文件并逐渐遍历目录树。我该怎么办?我正在使用函数FindFirstFile,FindNextFile和FindClose,我是c ++中的新手。我有类似的东西......
例如,我有这个简单的目录树
Parent(folder)\
file1.txt
file2.txt
Child(folder)\
file3.txt
file4.txt
我需要一个带有方法的类,例如getNextFile(),第一次调用返回file1.txt;第二次调用返回file2.txt,第三次调用返回Child(文件夹),第四次调用返回file3.txt等等......
编辑重复标记:我基本上需要在没有do / 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));
答案 0 :(得分:3)
使用正确的工具。 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调用会不好?
实质上,winapi大约有二十年的历史;世界其他地方的可用性改进很多 。除非你有充分的理由,否则我会尝试使用常见的库(例如Boost)尽可能多地抽象它。
我认为这并没有解决我的问题,我编辑了原帖以使其更清晰。
基本上需要遍历树而不用do / while,while或for ...我需要某种迭代器,可以存储以供以后使用
这正是我的回答:在for循环中给你一个迭代器。我不明白什么不符合您的编辑规范。
此外,最好只使用WinAPI,因为它必须在具有Windows的不同计算机上工作,并且安装boost可能是个问题。
您无需在任何这些计算机上安装boost。 Boost :: filesystem可以很方便地静态链接;此外,老式的Windows窗口方式只是提供boost_filesystem*.dll
和boost_system*.dll
以及二进制文件。但是,如果您的目标是包含所有所需功能的单个可执行文件,那么无论如何都会进行静态链接,所以这绝对没有问题。
答案 1 :(得分:3)
以下是在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 等。您也可以将其作为参数传递给此函数,以使其更通用。