Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.28;
Скачать: CL | DM;

Вниз

FindFirst   Найти похожие ветки 

 
silver222   (2008-08-18 17:56) [0]

При поиске файлов 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;


 
clickmaker ©   (2008-08-18 18:01) [1]

> когда задаю *.txt то директорий не видит

даже с расширением txt?


 
silver222   (2008-08-18 18:06) [2]

> clickmaker ©   (18.08.08 18:01) [1]

ищет. А нельзя так задать параметры поиска чтобы директории все брал а файлы только по маске?


 
clickmaker ©   (2008-08-18 18:10) [3]

> [2] silver222   (18.08.08 18:06)

наверно нет. Можно искать все, а потом применять MatchesMask()


 
silver222   (2008-08-18 18:19) [4]

а если мне нужно искать *.txt,*.doc,*.rtf можно както сразу проверить найден файл с нужным расширением или нет, чтобы не писать множество MatchesMask?


 
{RASkov} ©   (2008-08-18 18:30) [5]

> [4] silver222   (18.08.08 18:19)
> а если мне нужно искать *.txt,*.doc,*.rtf можно както сразу
> проверить найден файл с нужным расширением или нет

А сам-то как думаешь? или в FindFirst ИИ встроен?)


> var
> list: TStrings;

Не нужно это, достаточно так:
Memo1.Lines.Clear;
ScanDir("d:\data", "*.txt", Memo1.Lines);


 
{RASkov} ©   (2008-08-18 19:01) [6]

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 19:12) [7]

> 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;


 
Loginov Dmitry ©   (2008-08-18 22:23) [8]

Оптимизация :)

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;



Страницы: 1 вся ветка

Текущий архив: 2008.09.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
15-1218265100
Dmitry S
2008-08-09 10:58
2008.09.28
Кодирование видео


2-1218740764
programmer90
2008-08-14 23:06
2008.09.28
Как скрыть меню в программе


2-1219062308
Сталкер
2008-08-18 16:25
2008.09.28
Выбор из справочника


15-1217942447
Krummer
2008-08-05 17:20
2008.09.28
Как получить управление над внешней программой ?


1-1198754585
Kerk
2007-12-27 14:23
2008.09.28
Не переключается раскладка клавиатуры в Excel в OLE-контейнере