Главная страница
    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.049 c
2-1218824814
inforoom
2008-08-15 22:26
2008.09.28
Создана ли Форма?


15-1218114418
Vlad Oshin
2008-08-07 17:06
2008.09.28
Программа вываливается в AV на 666 строке :)


2-1219226715
Jolik
2008-08-20 14:05
2008.09.28
Как установить соединение через прокси?...


4-1197104970
Nil
2007-12-08 12:09
2008.09.28
Прозрачность части окна


15-1217925962
DoKi
2008-08-05 12:46
2008.09.28
рассчёт нормалей





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский