procedure FindFilesByMask(List :tStrings; var DirCount :Integer; const DirName, Mask :String; SubDir: Boolean = True);
procedure ScanDirs(const DirName :String);
var
h :tHandle;
wfd :tWin32FindData;
sfo :string;
n :integer;
SearchRec2 :TSearchRec;
begin
Inc(DirCount);
h := Windows.FindFirstFile(PChar(DirName+Mask), wfd);
end;
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;
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;
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;
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;