Форум: "Начинающим";
Текущий архив: 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