pesquisa de arquivos recursiva usando C ++ MFC?
-
06-09-2019 - |
Pergunta
O que é a forma mais limpa para recursivamente procurar arquivos usando C ++ e MFC?
EDIT: Alguma dessas soluções oferecem a capacidade de usar vários filtros através de uma passagem? Eu acho que com CFileFind eu poderia filtrar *. * E código personalizado, em seguida, de gravação para mais filtro em diferentes tipos de arquivo. Será que oferecem nada de built-in vários filtros (ie. * .Exe, *. Dll)?
EDIT2: Só percebi um pressuposto óbvio que eu estava fazendo que faz o meu inválida EDIT anterior. Se eu estou tentando fazer uma pesquisa recursiva com CFileFind, eu tenho que usar *. * Como o meu curinga porque senão subdiretórios não vai ser correspondido e sem recursão ocorrerá. Assim, a filtragem em diferentes file-extentions terá que ser tratado separadamente independentemente.
Solução
Usando CFileFind
.
Dê uma olhada neste exemplo de MSDN:
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();
}
Outras dicas
Sistema de Arquivos do impulso !
O exemplo recursiva é mesmo na página inicial do sistema de arquivos:
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;
}
Eu sei que não é a sua pergunta, mas também é fácil para sem recursão usando um 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();
}
}
Confira o href="http://www.recls.org/" rel="nofollow noreferrer"> recls biblioteca - representa rec ursive ls - que é uma biblioteca de pesquisa recursiva que funciona em UNIX e Windows. É uma biblioteca C com adaptações à língua diferente, incluindo C ++. De memória, você pode usá-lo algo como o seguinte:
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());
}
Ele vai encontrar todos os arquivos .doc, e todos os arquivos .xls começando com abc em C:. \ Mydir ou qualquer de seus subdiretórios
Eu não tenho compilado isso, mas deve ser muito perto da marca.
CString strNextFileName , strSaveLog= "C:\\mydir";
Find.FindFile(strSaveLog);
BOOL l = Find.FindNextFile();
if(!l)
MessageBox("");
strNextFileName = Find.GetFileName();
não o seu trabalho. Find.FindNextFile () retornando falsos até mesmo os arquivos estão presentes na mesma directory``