![]() |
|
|
#1
|
|||
|
|||
|
Добрый день, товарищи программисты!
Помогите пожалуйста! В предыдущей теме был задан вопрос поиска файла. Мне нужно найти все файлы с расширениями .doc .xls .txt .rtf и ввести их пути в memo1. Сложность заключается в том, что файлов множество, найти их нужно все. Спасибо!!! |
|
#2
|
||||
|
||||
|
Код:
procedure Find(const Path, SearchMask : String; var Memo : TMemo);
var
fs : TSearchRec;
i : Integer;
begin
Application.ProcessMessages;
i := FindFirst(Path + '\' + SearchMask, faAnyFile, fs);
while i = 0 do begin
Memo.Lines.Add(path + '\' + fs.Name);
i := FindNext(fs);
end;
i := FindFirst(Path + '\*', faDirectory or faAnyFile, fs);
while i = 0 do begin
if (fs.Name <> '.') and (fs.Name <> '..') and
((fs.Attr and faDirectory) <> 0) then
Find(Path + '\' + fs.Name, SearchMask, Memo);
i := FindNext(fs);
end;
FindClose(fs);
end;Последний раз редактировалось zip000, 09.07.2008 в 21:39. |
|
#3
|
|||
|
|||
|
Можно съэкономить время, если:
- искать в 1 проход с рекурсией по каталогам сразу; - искать по маске *.* и внутри проверять соответствие. Код:
uses Masks;
procedure TForm1.SearchFiles(APath : String);
const
SearchMasks : Array [0..3] Of String = ('*.doc','*.xls','*.txt','*.rtf');
var
iFound : Integer;
F : TSearchRec;
function IsMatchMask(AFileName : String) : Boolean;
var
I : Integer;
begin
Result := False;
For I := Low(SearchMasks) To High(SearchMasks) Do
Begin
Result := MatchesMask(AFileName,SearchMasks[i]);
If Result Then Break;
End;
end;
begin
APath := IncludeTrailingPathDelimiter(APath);
iFound := FindFirst(APath + '*.*',faAnyFile,F);
While iFound = 0 Do
Begin
If (F.Attr And faDirectory) <> 0
Then
Begin
If (F.Name <> '.') And (F.Name <> '..')
Then SearchFiles(APath + F.Name);
End
Else
If IsMatchMask(F.Name)
Then Memo1.Lines.Add(APath + F.Name);
iFound := FindNext(F);
End;
FindClose(F);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Ишем на диске C:
Memo1.Lines.Clear;
SearchFiles('c:');
end;Если надо автоматом перебрать все диски, то это уже чуть сложнее - надо получить список всех дисков и в цикле пройти по ним. |
|
#4
|
||||
|
||||
|
lmikle, думается что ваш вариант с перебором всех подряд файлов будет медленнее работать, обычно файлов на дисках десятки тысяч, поэтому времени это займет много.
|
|
#5
|
|||
|
|||
|
Огромное спасибо!!!
Буду пробовать |