Как искать файлы разных типов, используя FindFirst?
В моем приложении я использую следующую процедуру для рекурсивного сканирования любой папки и подпапок, если папка содержит текстовые файлы (*.txt), я добавляю имя файла в TStringList, определенный в моей процедуре:
procedure FileSearch(const PathName: string; var lstFiles: TStringList);
const
FileMask = '*.txt';
var
Rec: TSearchRec;
Path: string;
begin
Path := IncludeTrailingBackslash(PathName);
if FindFirst(Path + FileMask, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
lstFiles.Add(Path + Rec.Name);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
try
repeat
if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name <> '.') and
(Rec.Name <> '..') then
FileSearch(Path + Rec.Name, lstFiles);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
end;
Все работает отлично, но я хочу иметь возможность искать несколько расширений файлов. Я попытался изменить FileMask, чтобы сделать это, но каждый раз, когда он ничего не возвращает, вероятно, потому что он ищет недопустимое расширение. Я попробовал каждое из следующих безуспешно: (очевидно, пытался по одному, я не писал строки 3 раза в моей процедуре)
FileMask = '*.txt|*.rtf|*.doc';
FileMask = '*.txt;*.rtf;*.doc';
FileMask = '*.txt,*.rtf,*.doc';
Я чувствую себя глупо, спрашивая об этом, но как мне разрешить включение дополнительных расширений файлов в поиск? Я могу сделать это для диалогов Open и Save, почему я не могу разделить расширения здесь?
Благодарю.
Крейг.
2 ответа
Измените свою функцию, чтобы она также принимала список расширений, разделенных точками с запятой или каким-либо другим разделителем. Затем вы можете проверить наличие каждого найденного расширения файла в этом списке расширений и, если он найден, добавить его в список строк.
Примерно так должно работать:
procedure FileSearch(const PathName: string; const Extensions: string;
var lstFiles: TStringList);
const
FileMask = '*.*';
var
Rec: TSearchRec;
Path: string;
begin
Path := IncludeTrailingBackslash(PathName);
if FindFirst(Path + FileMask, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
if AnsiPos(ExtractFileExt(Rec.Name), Extensions) > 0 then
lstFiles.Add(Path + Rec.Name);
until FindNext(Rec) <> 0;
finally
SysUtils.FindClose(Rec);
end;
if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
try
repeat
if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name <> '.') and
(Rec.Name <> '..') then
FileSearch(Path + Rec.Name, Extensions, lstFiles);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
end;
Образец звонка:
FileSearch('C:\Temp', '.txt;.tmp;.exe;.doc', FileList);
В Delphi XE7 эта строка кода генерирует (строка 17) ошибку:
finally
SysUtils.FindClose(Rec);
end;
Чтобы исправить ошибку я просто удалил SysUtils.
читать этот код:
finally
FindClose(Rec);
end;
Теперь код компилируется нормально. Спасибо за этот очень полезный код и решение.