-
Автор темы
- #1
Цель: получить список всех файлов в указанном каталоге и его подкаталогах.
Расписывать что-то нету смысла, использован простой рекурсивный перебор))
Данные все занесем в контейнер(была такая необходимость с заскоком в будущее)
сам поиск
обработка:
К сожалению функция не поддерживает поиск по нескольким масскам, поэтому, если нужно выбрать фаилы только определенных расширений, то пользуемся сторонними методами., например такими:
Расписывать что-то нету смысла, использован простой рекурсивный перебор))
Данные все занесем в контейнер(была такая необходимость с заскоком в будущее)
Код:
//структура хранения данных о файле
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);
}
}