如何逐步遍历目录树?
How to walk through directory tree step by step?
我找到了很多遍历目录树的例子,但我需要一些不同的东西。我需要一个 class 和一些方法,每个方法从目录中调用 returns 一个文件并逐渐遍历目录树。请问我该怎么做?我正在使用函数 FindFirstFile、FindNextFile 和 FindClose,我是 C++ 的新手。我有这样的东西...
例如我有这个简单的目录树
Parent(folder)\
file1.txt
file2.txt
Child(folder)\
file3.txt
file4.txt
我需要一个 class 方法,例如 getNextFile(),首先调用 returns file1.txt;第二次调用 returns file2.txt,第三次调用 returns 子(文件夹),第四次调用 returns 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));
使用正确的工具。 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";
}
}
如果您不关心您的文件是否与特定模式匹配,请删除整个正则表达式业务。
编辑:
Could you please explain why it would be bad to use directly API calls ?
- 它丑陋且难以阅读,更难正确,
- 一点都不便携,最重要的是,
- 在使用 raw win api 时,您可能需要处理一百万个极端情况。 Boost 的编写者已经执行了数百次此操作,并且经过了严格的代码审查,所以请走保存路线,不要重新发明轮子。
本质上,winapi 已经有二十年历史了;在世界其他地区, 的可用性得到了很大改善。除非你有充分的理由,否则我会尝试使用通用库(例如 Boost)尽可能多地抽象掉它。
I think this does not solves my problem, I edited the original post to make it clearer.
basically need walk through tree without do/while, while or for...I need some kind of iterator, which can be stored for later use
这正是我的答案所做的:在 for 循环中为您提供一个迭代器。我不明白有什么不符合您的 Edit 的规范。
In addition, it would be best to use only WinAPI, because it has to work on different computers with windows and installing boost could be a problem.
您不必在这些计算机上安装 boost。 Boost::filesystem 可以轻松地静态链接;此外,老式的 windows 方法只是将 boost_filesystem*.dll
和 boost_system*.dll
与您的二进制文件一起交付。但是,如果您的目标是包含所有需要的功能的单个可执行文件,那么无论如何您都会选择静态链接,所以这绝对没有问题。
这是在 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 等。您也可以将其作为参数传递给此函数以使其更通用。
我找到了很多遍历目录树的例子,但我需要一些不同的东西。我需要一个 class 和一些方法,每个方法从目录中调用 returns 一个文件并逐渐遍历目录树。请问我该怎么做?我正在使用函数 FindFirstFile、FindNextFile 和 FindClose,我是 C++ 的新手。我有这样的东西...
例如我有这个简单的目录树
Parent(folder)\
file1.txt
file2.txt
Child(folder)\
file3.txt
file4.txt
我需要一个 class 方法,例如 getNextFile(),首先调用 returns file1.txt;第二次调用 returns file2.txt,第三次调用 returns 子(文件夹),第四次调用 returns 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));
使用正确的工具。 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";
}
}
如果您不关心您的文件是否与特定模式匹配,请删除整个正则表达式业务。
编辑:
Could you please explain why it would be bad to use directly API calls ?
- 它丑陋且难以阅读,更难正确,
- 一点都不便携,最重要的是,
- 在使用 raw win api 时,您可能需要处理一百万个极端情况。 Boost 的编写者已经执行了数百次此操作,并且经过了严格的代码审查,所以请走保存路线,不要重新发明轮子。
本质上,winapi 已经有二十年历史了;在世界其他地区, 的可用性得到了很大改善。除非你有充分的理由,否则我会尝试使用通用库(例如 Boost)尽可能多地抽象掉它。
I think this does not solves my problem, I edited the original post to make it clearer.
basically need walk through tree without do/while, while or for...I need some kind of iterator, which can be stored for later use
这正是我的答案所做的:在 for 循环中为您提供一个迭代器。我不明白有什么不符合您的 Edit 的规范。
In addition, it would be best to use only WinAPI, because it has to work on different computers with windows and installing boost could be a problem.
您不必在这些计算机上安装 boost。 Boost::filesystem 可以轻松地静态链接;此外,老式的 windows 方法只是将 boost_filesystem*.dll
和 boost_system*.dll
与您的二进制文件一起交付。但是,如果您的目标是包含所有需要的功能的单个可执行文件,那么无论如何您都会选择静态链接,所以这绝对没有问题。
这是在 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 等。您也可以将其作为参数传递给此函数以使其更通用。