recherche de fichiers récursive en C ++ MFC?
-
06-09-2019 - |
Question
Quelle est la façon la plus propre à la recherche récursive pour les fichiers en utilisant C ++ et MFC?
EDIT: Est-ce que l'une de ces solutions offrent la possibilité d'utiliser plusieurs filtres passe par l'un? Je suppose que je pourrais avec CFileFind filtrer *. * Puis écrire du code personnalisé pour filtrer davantage dans différents types de fichiers. Est-ce que l'offre de quoi que ce soit intégré dans plusieurs filtres (ie. * .Exe, *. Dll)?
EDIT2: Il suffit de réaliser une hypothèse évidente que je faisais qui fait mon précédent EDIT invalide. Si je suis en train de faire une recherche récursive avec CFileFind, je dois utiliser *. * Comme mon caractère générique car sinon les sous-répertoires ne seront pas jumelés et aucune récursivité aura lieu. filtrage sur les différents fichiers de façon-extentions devra être traitée séparément, indépendamment.
La solution
Utilisation CFileFind
.
Jetez un oeil à cette 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();
}
Autres conseils
Utilisez la mise en œuvre de systèmes de fichiers Boost!
L'exemple récursif est même sur la page d'accueil du système de fichiers:
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;
}
Je sais que ce n'est pas votre question, mais il est aussi facile à Tô sans récursivité en utilisant un 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();
}
}
Consultez la recls bibliothèque - est synonyme de rec ursive ls - qui est une bibliothèque de recherche récursive qui fonctionne sous UNIX et Windows. Il est une bibliothèque C avec des adaptations à différentes langues, y compris C ++. De mémoire, vous pouvez l'utiliser quelque chose comme ce qui suit:
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());
}
Il trouverez tous les fichiers .doc, et tous les fichiers .xls commençant par abc dans C:. \ Mydir ou de ses sous-répertoires
Je n'ai pas compilé, mais il devrait être assez proche de la marque.
CString strNextFileName , strSaveLog= "C:\\mydir";
Find.FindFile(strSaveLog);
BOOL l = Find.FindNextFile();
if(!l)
MessageBox("");
strNextFileName = Find.GetFileName();
Son ne fonctionne pas. Find.FindNextFile () renvoie false même les fichiers sont présents dans le même directory``