Поиск файлов

Функция поиска файлов по маске в заданной и вложенных папках.
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);
}
 
« Предыдущая статья   Следующая статья »