Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

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

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

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




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

//контейнер хранения структур данных
std::vector<_DATAFILE> vDataFile;

сам поиск
Код:
Expand Collapse Copy
//рекурсивный поиск файлов
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);
}


обработка:
Код:
Expand Collapse Copy
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;//после каждого файла делаем отступ в одну троку в консоле
   }

9ec5371c5b21491cbea5f0fd94d3a159.png


К сожалению функция не поддерживает поиск по нескольким масскам, поэтому, если нужно выбрать фаилы только определенных расширений, то пользуемся сторонними методами., например такими:
Код:
Expand Collapse Copy
  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);
            }
           
           }
 
Назад
Сверху Снизу