![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FindFirst [D6, XP]
silver222 © (2008-08-18 17:56:00)При поиске файлов FindFirst(StartDir+Mask, faAnyFile , SearchRec) когда задаю маску *.* находит и файлы и директории, но когда задаю *.txt то директорий не видит в чем проблема? мне нужно найти список файлов во всех поддиректориях по заданой маске. делаю так:
procedure ScanDir(StartDir, Mask: String; List: TStrings);
var
SearchRec: TSearchRec;
begin
if Mask = '' then Mask:= '*.*';
if StartDir[Length(StartDir)] <> '' then StartDir := StartDir + '\';
if FindFirst(StartDir+Mask, faAnyFile , SearchRec) = 0 then
begin
repeat
Application.ProcessMessages;
if (SearchRec.Attr and faDirectory) <> faDirectory then
List.Add(StartDir + SearchRec.Name)
else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
ScanDir(StartDir + SearchRec.Name + '',Mask,List);
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;
вызываю:
procedure TForm1.Button1Click(Sender: TObject);
var
list: TStrings;
begin
list:= TStringList.Create;
ScanDir('d:\data', '*.txt', list);
Memo1.Lines:= list;
list.Free;
ShowMessage('end');
end;
Loginov Dmitry (2008-08-18 22:23:00) [1]Оптимизация :)
procedure ScanDir(APath: String; const AMask: array of String; AList: TStrings);
begin
Screen.Cursor:=crHourGlass;
AList.BeginUpdate;
try
_ScanDir(APath, AMask, AList);
finally
Screen.Cursor:=crDefault;
AList.EndUpdate;
end;
end;
{RASkov} (2008-08-18 19:12:00) [2]> procedure _ScanDir(APath: String; const AMask: array of String; AList: TStrings);
В _ScanDir можно опустить все параметры кроме первого. Т.е. вот как:
procedure ScanDir(APath: String; const AMask: array of String; AList: TStrings);
procedure _ScanDir(APath: String);
.......
if (SRec.Attr and faDirectory)=faDirectory then
_ScanDir(APath+SRec.Name)
.........
begin
.........
_ScanDir(APath);
end;
{RASkov} (2008-08-18 19:01:00) [3]
procedure ScanDir(APath: String; const AMask: array of String; AList: TStrings);
procedure _ScanDir(APath: String; const AMask: array of String; AList: TStrings);
var SRec: TSearchRec; N: Integer;
begin
APath:=IncludeTrailingPathDelimiter(APath);
Screen.Cursor:=crHourGlass; AList.BeginUpdate;
if FindFirst(APath+'*', faAnyFile, SRec) = 0 then
try repeat
if (sRec.Name='.') or (sRec.Name='..') then Continue;
if (SRec.Attr and faDirectory)=faDirectory then
_ScanDir(APath+SRec.Name, AMask, AList)
else for N:= Low(AMask) to High(AMask) do
if MatchesMask(SRec.Name, AMask[N]) then AList.Add(APath+SRec.Name);
until FindNext(SRec) <> 0;
finally FindClose(SRec); Screen.Cursor:=crDefault; AList.EndUpdate; end;
end;
begin
if not Assigned(AList) then raise Exception.Create('AList не инициализирован!')
else AList.Clear;
_ScanDir(APath, AMask, AList);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ScanDir('d:\data', ['*.txt', '*.doc', '*.rtf'], Memo1.Lines);
end;
{RASkov} (2008-08-18 18:30:00) [4]> [4] silver222 (18.08.08 18:19)
> а если мне нужно искать *.txt,*.doc,*.rtf можно както сразу
> проверить найден файл с нужным расширением или нет
А сам-то как думаешь? или в FindFirst ИИ встроен?)
> var
> list: TStrings;
Не нужно это, достаточно так:
Memo1.Lines.Clear;
ScanDir('d:\data', '*.txt', Memo1.Lines);
silver222 (2008-08-18 18:19:00) [5]а если мне нужно искать *.txt,*.doc,*.rtf можно както сразу проверить найден файл с нужным расширением или нет, чтобы не писать множество MatchesMask?
clickmaker (2008-08-18 18:10:00) [6]> [2] silver222 (18.08.08 18:06)
наверно нет. Можно искать все, а потом применять MatchesMask()
silver222 (2008-08-18 18:06:00) [7]> clickmaker © (18.08.08 18:01) [1]
ищет. А нельзя так задать параметры поиска чтобы директории все брал а файлы только по маске?
clickmaker (2008-08-18 18:01:00) [8]> когда задаю *.txt то директорий не видит
даже с расширением txt?