使用C ++和MFC递归搜索文件的最简洁方法是什么?
编辑:这些解决方案中的任何一个都能够通过一次通过使用多个过滤器吗?我想用CFileFind我可以过滤*。*然后编写自定义代码以进一步过滤到不同的文件类型。有什么东西提供内置的多个过滤器(即。* .exe,*。dll)?
EDIT2:刚刚意识到我做的一个明显的假设使我以前的编辑无效。如果我尝试使用CFileFind进行递归搜索,我必须使用*。*作为我的通配符,因为否则子目录将不匹配且不会发生递归。因此,无论如何都必须单独处理对不同文件扩展的过滤。
答案 0 :(得分:12)
使用CFileFind
。
从MSDN中查看此example:
void Recurse(LPCTSTR pstr)
{
CFileFind finder;
// build a string with wildcards
CString strWildcard(pstr);
strWildcard += _T("\\*.*");
// start working for files
BOOL bWorking = finder.FindFile(strWildcard);
while (bWorking)
{
bWorking = finder.FindNextFile();
// skip . and .. files; otherwise, we'd
// recur infinitely!
if (finder.IsDots())
continue;
// if it's a directory, recursively search it
if (finder.IsDirectory())
{
CString str = finder.GetFilePath();
cout << (LPCTSTR) str << endl;
Recurse(str);
}
}
finder.Close();
}
答案 1 :(得分:4)
使用Boost's Filesystem实施!
递归示例甚至在文件系统主页上:
bool find_file( const path & dir_path, // in this directory,
const std::string & file_name, // search for this name,
path & path_found ) // placing path here if found
{
if ( !exists( dir_path ) ) return false;
directory_iterator end_itr; // default construction yields past-the-end
for ( directory_iterator itr( dir_path );
itr != end_itr;
++itr )
{
if ( is_directory(itr->status()) )
{
if ( find_file( itr->path(), file_name, path_found ) ) return true;
}
else if ( itr->leaf() == file_name ) // see below
{
path_found = itr->path();
return true;
}
}
return false;
}
答案 2 :(得分:2)
我知道这不是你的问题,但使用CStringArray
void FindFiles(CString srcFolder)
{
CStringArray dirs;
dirs.Add(srcFolder + "\\*.*");
while(dirs.GetSize() > 0) {
CString dir = dirs.GetAt(0);
dirs.RemoveAt(0);
CFileFind ff;
BOOL good = ff.FindFile(dir);
while(good) {
good = ff.FindNextFile();
if(!ff.IsDots()) {
if(!ff.IsDirectory()) {
//process file
} else {
//new directory (and not . or ..)
dirs.InsertAt(0,nd + "\\*.*");
}
}
}
ff.Close();
}
}
答案 3 :(得分:2)
查看recls库 - 代表 rec ursive ls - 这是一个适用于UNIX和Windows的递归搜索库。它是一个C库,适应不同的语言,包括C ++。从内存中,您可以使用以下内容:
using recls::search_sequence;
CString dir = "C:\\mydir";
CString patterns = "*.doc;abc*.xls";
CStringArray paths;
search_sequence files(dir, patterns, recls::RECURSIVE);
for(search_sequence::const_iterator b = files.begin(); b != files.end(); b++) {
paths.Add((*b).c_str());
}
它将在C:\ mydir或其任何子目录中找到所有.doc文件和所有.xls文件,以abc开头。
我没有编译过这个,但它应该非常接近标记。
答案 4 :(得分:-1)
CString strNextFileName , strSaveLog= "C:\\mydir";
Find.FindFile(strSaveLog);
BOOL l = Find.FindNextFile();
if(!l)
MessageBox("");
strNextFileName = Find.GetFileName();
它不起作用。 Find.FindNextFile()返回false,即使文件存在于同一目录``
中