Рекурсивный поиск файлов с использованием C ++ MFC? - PullRequest
3 голосов
/ 27 мая 2009

Какой самый чистый способ рекурсивного поиска файлов с использованием C ++ и MFC?

РЕДАКТИРОВАТЬ: предлагает ли какое-либо из этих решений возможность использовать несколько фильтров за один проход? Я предполагаю, что с CFileFind я мог бы фильтровать по *. *, А затем писать собственный код для дальнейшей фильтрации по различным типам файлов. Что-нибудь предлагает встроенные несколько фильтров (например. * .Exe, *. Dll)?

РЕДАКТИРОВАТЬ2: Просто понял очевидное предположение, что я сделал, что делает мой предыдущий РЕДАКТИРОВАТЬ недействительным. Если я пытаюсь выполнить рекурсивный поиск с CFileFind, я должен использовать *. * В качестве моего подстановочного знака, потому что в противном случае подкаталоги не будут совпадать, и никакой рекурсии не будет. Таким образом, фильтрация по различным расширениям файлов должна обрабатываться отдельно, независимо от этого.

Ответы [ 5 ]

12 голосов
/ 27 мая 2009

Использование CFileFind.

Взгляните на этот пример от 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();
}
4 голосов
/ 27 мая 2009

Использование 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 голосов
/ 28 мая 2009

Ознакомьтесь с библиотекой 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());
}

Он найдет все файлы .doc и все файлы .xls, начинающиеся с abc, в C: \ mydir или любом из его подкаталогов.

Я не скомпилировал это, но оно должно быть довольно близко к отметке.

2 голосов
/ 27 мая 2009

Я знаю, что это не ваш вопрос, но также легко обойтись без рекурсии, используя 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();
  }
}
0 голосов
/ 10 апреля 2015
CString strNextFileName , strSaveLog= "C:\\mydir";
Find.FindFile(strSaveLog);
BOOL l = Find.FindNextFile();
if(!l)
    MessageBox("");
strNextFileName = Find.GetFileName();

Это не работает. Find.FindNextFile () возвращает false, даже если файлы находятся в одном каталоге``

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...