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;
}