Функция поиска файлов по маске в заданной и вложенных папках.
BOOL SearchFiles( LPCTSTR lpszFileName, // Директория и маска файлов для поиска LPSEARCHFUNC lpSearchFunc, // Функция, вызываемая для всех найденных файлов. BOOL bInnerFolders /* = TRUE */) // TRUE - поиск в подпапках. // FALSE - поиск только в заданной папке typedef void (*LPSEARCHFUNC)(LPCTSTR lpszFileName);
BOOL SearchFiles(LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders = TRUE) { LPTSTR part; char tmp[MAX_PATH]; // временный массив char name[MAX_PATH];
HANDLE hSearch = NULL; WIN32_FIND_DATA wfd; memset(&wfd, 0, sizeof(WIN32_FIND_DATA));
// сначало поиск внутри вложенных папках ... if(bInnerFolders) { if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE; strcpy(name, part); strcpy(part, "*.*");
// если папки существуют, то делаем поиск wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE)) do { // в каждой папке есть две папки с именами "." и ".." // и эти папки мы не трогаем
// пропускаем папки "." и ".." if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2)) continue; if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку { char next[MAX_PATH]; if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE; strcpy(part, wfd.cFileName); strcat(next, "\\"); strcat(next, name);
SearchFiles(next, lpSearchFunc, TRUE); } } while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
FindClose (hSearch); // заканчиваем поиск }
if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE) return TRUE; // в противном случае выходим do if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // если мы нашли файл { char file[MAX_PATH]; if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE; strcpy(part, wfd.cFileName);
lpSearchFunc(file); } while (FindNextFile(hSearch, &wfd)); // ищем следующий файл FindClose (hSearch); // заканчиваем поиск
return TRUE; } Пример 1. Поиск всех файлов с расширением txt в папке "C:\Dir1" и вложенных в нее папках.SearchFiles("C:\Dir1\*.txt", DoSomething, TRUE); Пример 2. Поиск всех файлов с именем name и любым расширением только в папке "C:\Dir1"SearchFiles("C:\Dir1\name.*", DoSomething, FALSE); Пример функции DoSomething
void DoSomething(LPCTSTR lpszFileName) { MessageBox(NULL, lpszFileName, "Find File", MB_OK | MB_APPLMODAL); }
|