Привет.
Вот универсальная функция для поиска файлов по имени, расширению и др. :
| Код | #include <SysUtils.hpp> #include <Masks.hpp>
//Флаг для принудительной остановки процесса поиска bool SearchIsStopped = false;
//FilesSearch возвращает список найденных файлов в виде объекта TStringList, //или NULL, если необходимые файлы не удалось обнаружить
//Аргументы: //AnsiString ASearchFolder - целевой каталог, в котором должен быть произведён поиск файлов, напр.: "c:\\windows" //AnsiString ASearchMask - маска для поиска файлов, напр.: "win*.*", "*.exe", ... //bool ASearchInSubFolders - флаг, разрешающий поиск в подкаталогах TStringList * __fastcall FilesSearch(AnsiString ASearchFolder, AnsiString ASearchMask, bool ASearchInSubFolders) { TStringList *Result = NULL;
if (Sysutils::DirectoryExists(ASearchFolder)) { TSearchRec SearchRec;
AnsiString MaskFolderString; //Список для хранения найденных каталогов TStringList *FoldersList = new TStringList(); FoldersList->Clear();
FoldersList->Append(ASearchFolder);
//Нормализация пути (можно использовать NormalDir(...) из RxLib или JEDI VCL) if (FoldersList->Strings[0][FoldersList->Strings[0].Length()] != '\\') { FoldersList->Strings[0] = FoldersList->Strings[0] + "\\"; }
for (int m = 0; m < FoldersList->Count; m++) { //Маска поиска - все файлы и подкаталоги MaskFolderString = FoldersList->Strings[m] + "*.*"; //Поиск всех подкаталогов в выбраном каталоге for (int k = 0; ; ) { if (!k) { if (FindFirst(MaskFolderString, faAnyFile, SearchRec)) { FindClose(SearchRec); break; } else { k++; } } else { if (FindNext(SearchRec)) { FindClose(SearchRec); break; } }
//Если это подкаталог - добавляем его к списку FoldersList, если это разрешено if(SearchRec.Attr&faDirectory) { if(ASearchInSubFolders) { if((SearchRec.Name != ".") && (SearchRec.Name != "..")) { FoldersList->Append(AnsiString(FoldersList->Strings[m] + SearchRec.Name));
//Нормализация пути (можно использовать NormalDir(...) из RxLib или JEDI VCL) if (FoldersList->Strings[FoldersList->Count - 1][FoldersList->Strings[FoldersList->Count - 1].Length()] != '\\') { FoldersList->Strings[FoldersList->Count - 1] = FoldersList->Strings[FoldersList->Count - 1] + "\\"; } } } } //Если это нужный файл - добавляем его к выходному списку Result else if( !(SearchRec.Attr & (faVolumeID|faDirectory)) ) { //Проверка имени файла по маске поиска if (MatchesMask(SearchRec.Name, ASearchMask)) { if (!Result) { Result = new TStringList(); Result->Clear(); } Result->Append(FoldersList->Strings[m] + SearchRec.Name); } } //Обработка очереди сообщений Application->ProcessMessages();
//Выход из режима поиска, если нужно if (SearchIsStopped) { break; } } }
delete FoldersList; }
return Result; }
|
Использование:
| Код | TStringList * FilesList;
//Найдёт все EXE-файлы в каталоге c:\windows и во всех его подкаталогах FilesList = FilesSearch("c:\\windows" , "*.exe", true);
if (FilesList) { //Работа с найденными файлами...
delete FilesList; }
//Найдёт все начинающиеся на "win" файлы в каталоге c:\windows и во всех его подкаталогах FilesList = FilesSearch("c:\\windows" , "win*.*", true);
if (FilesList) { //Работа с найденными файлами...
delete FilesList; }
|
Функция FilesSearch для поиска файлов рекурсию не использует. |