Список фаилов в папке и подпапках

Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
999
Реакции[?]
1,209
Поинты[?]
3K
Цель: получить список всех файлов в указанном каталоге и его подкаталогах.

Расписывать что-то нету смысла, использован простой рекурсивный перебор))




Данные все занесем в контейнер(была такая необходимость с заскоком в будущее)
Код:
//структура хранения данных о файле
struct _DATAFILE
{
   std::string szName;
   std::string szPath;
}DATAFILE;

//контейнер хранения структур данных
std::vector<_DATAFILE> vDataFile;
сам поиск
Код:
//рекурсивный поиск файлов
void FindAll(std::string szPath)
{
   std::string strFiles;
   WIN32_FIND_DATA data;
   HANDLE hFile;
   std::string strSpec = szPath + "\\*.*";
   hFile = FindFirstFile(strSpec.c_str(), &data);
   if (hFile == INVALID_HANDLE_VALUE)
     return;

   do {
     strSpec = data.cFileName;  
     if (strSpec != "." && strSpec != "..")
     {
       if (!(data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
       {
         strSpec = szPath + "\\" + strSpec;
         if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
         {
           FindAll(strSpec);
         }
         else {
           if (data.nFileSizeLow != 0 || data.nFileSizeHigh != 0)
           {
             DATAFILE.szName = data.cFileName;
             DATAFILE.szPath = strSpec;    
             vDataFile.push_back(DATAFILE);
           }
         }
       }
     }
   } while (FindNextFile(hFile, &data));
   FindClose(hFile);
}

обработка:
Код:
FindAll("C:\\Tester"); //сканируем указвнную директорию и ее поддериктории на все файлы

  
   for (size_t i = 0; i < vDataFile.size(); i++) //перебираем результат сканирования
   {
     std::cout << "Name:  " << vDataFile[i].szName.c_str() << std::endl; //выводим имя
     std::cout << "  Path:  " << vDataFile[i].szPath.c_str() << std::endl;  // выводим относительный путь
     std::cout << std::endl;//после каждого файла делаем отступ в одну троку в консоле
   }


К сожалению функция не поддерживает поиск по нескольким масскам, поэтому, если нужно выбрать фаилы только определенных расширений, то пользуемся сторонними методами., например такими:
Код:
  if (data.nFileSizeLow != 0 || data.nFileSizeHigh != 0)
           {
             
             std::string FileName( data.cFileName)
            if( (FileName.find(".cpp")!= std::string::npos) || (FileName.find(".h")!= std::string::npos));
            {
             DATAFILE.szName = FileName;
             DATAFILE.szPath = strSpec;  
             vDataFile.push_back(DATAFILE);
            }
           
           }
 
Сверху Снизу