вот процедура, которая все находит:
| Код | procedure FindFilesByMask(List :tStrings; var DirCount :Integer; const DirName, Mask :String; SubDir: Boolean = True); // Поиск файлов по маске в заданной папке и подпапке
// Чем меньше параметров и локальных переменных у рекурсивной процедуры, // тем меньше она требует памяти под стек. Поэтому использую локальную // процедуру procedure ScanDirs(const DirName :String); var h :tHandle; wfd :tWin32FindData; begin Inc(DirCount); // просто для статистики // Сначала просмотрим текущий каталог по заданной маске h := Windows.FindFirstFile(PChar(DirName+Mask), wfd); try if h <> INVALID_HANDLE_VALUE then begin repeat if (wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then List.Add(DirName+wfd.cFileName); until not Windows.FindNextFile(h,wfd); end; // проверка кода ошибки и FindFirstFile и FindNextFile case GetLastError of ERROR_NO_MORE_FILES, // больше нет файлов и каталогов удовлетворяющих маске (но были) ERROR_FILE_NOT_FOUND, // вообще нет файлов и каталогов удовлетворяющих маске ERROR_SHARING_VIOLATION // возникает во время создания каталога (уже создан но еще недоступен) : ; // ничего не делаем, все Ok else // все остальные ошибки raise Exception.CreateFmt('Ошибка просмотра каталога "%s": %s',[DirName,SysErrorMessage(GetLastError)]); end; finally if h <> INVALID_HANDLE_VALUE then Windows.FindClose(h); end;
// Теперь рекрсивно просмотрим подкаталоги if not SubDir then exit; // 13.06.03 h := Windows.FindFirstFile(PChar(DirName+'*.*'), wfd); try if h <> INVALID_HANDLE_VALUE then begin repeat if ((wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0) and (wfd.cFileName <> String('.')) and (wfd.cFileName <> '..') then ScanDirs(IncludeTrailingPathDelimiter(DirName+wfd.cFileName)); until not Windows.FindNextFile(h,wfd); end; // проверка кода ошибки и FindFirstFile и FindNextFile case GetLastError of ERROR_NO_MORE_FILES, // больше нет файлов и каталогов удовлетворяющих маске (но были) ERROR_FILE_NOT_FOUND, // вообще нет файлов и каталогов удовлетворяющих маске ERROR_SHARING_VIOLATION // возникает во время создания каталога (уже создан но еще недоступен) : ; // ничего не делаем, все Ok else // все остальные ошибки raise Exception.CreateFmt('Ошибка просмотра каталога "%s": %s',[DirName,SysErrorMessage(GetLastError)]); end; finally if h <> INVALID_HANDLE_VALUE then Windows.FindClose(h); end; end;
begin // FindFilesByMask ScanDirs(IncludeTrailingPathDelimiter(DirName)); end; | Добавлено @ 18:37 Пример использования:
| Код | var n: Integer; begin FindFilesByMask(ListBox1.Items, n, 'Путь', '*.exe');
| |