FAQ по C/C++/Visual C++
Работа с сетью Поиск файлов |
Составители: SUnteXx, Leprecon |
Поиск файлов | |||
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); }Статья основана на примере SUnteXx'a Если есть какие-то замечания, предложения или что-то еще, то пишите: leprecon@pisem.net. |
Функция поиска файлов по маске в заданной и вложенных папках.|||
|
FAQ составлен по материалам Форума на Исходниках.Ру. Copyright © 2002 by Sources.ru. All rights reserved. |