Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.064 c
3-1206532972
Xmen
2008-03-26 15:02
2008.09.28
Хранимая процедура. Перевод строки


15-1217933277
Rouse_
2008-08-05 14:47
2008.09.28
От как нужно отмывать деньги на разработках :)


2-1219056039
dmitry_12_08_74
2008-08-18 14:40
2008.09.28
как послать в диалоговое окно сообщение


15-1218034460
alex-drob
2008-08-06 18:54
2008.09.28
Новый закон о безнадзорности


3-1207138799
tomkat
2008-04-02 16:19
2008.09.28
описание UDFS.DLL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский