// ================================================================ // 遍历某个文件夹下某种文件, // 使用说明 // _GetFileList(ListBox1.Items,'c:\*.doc'); // _GetFileList(MyTStringList,'c:\*.exe'); // ================================================================ procedure TForm1._GetFileList(AStrings: TStrings ; ASourFile: string); var sour_path,sour_file: string; TmpList:TStringList; FileRec:TSearchrec; begin sour_path:=ExtractFilePath(ASourFile); sour_file:=ExtractFileName(ASourFile); if not DirectoryExists(sour_path) then begin AStrings.Clear; exit; end; TmpList:=TStringList.Create; TmpList.Clear; if FindFirst(sour_path+sour_file,faAnyfile,FileRec) = 0 then repeat if ((FileRec.Attr and faDirectory) = 0) then begin TmpList.Add(sour_path+FileRec.Name) end; until FindNext(FileRec)<>0; SysUtils.FindClose(FileRec); AStrings.Assign(TmpList); TmpList.Free; end;
你看看这个,查找文件的代码: unit mainunit;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons,FileCtrl;type TForm1 = class(TForm) Memo1: TMemo; Label1: TLabel; Label2: TLabel; ComboBox1: TComboBox; Edit1: TEdit; BitBtn1: TBitBtn; BitBtn2: TBitBtn; BitBtn3: TBitBtn; Label3: TLabel; procedure FormCreate(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure Edit1Change(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure BitBtn3Click(Sender: TObject); private { Private declarations } public function CurrentIsValidDir(SearchRec:TSearchRec):integer; procedure RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer); { Public declarations } end;var Form1: TForm1; TotalFileNumbers:Integer; SearchFileType:String; implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); begin TotalFileNumbers:=0; SearchFileType:='*.txt'; end;function TForm1.CurrentIsValidDir(SearchRec:TSearchRec):integer; begin if ((SearchRec.Attr <> 16) and (SearchRec.Name<>'.') and (SearchRec.Name<>'..')) then Result:=0 else if ((SearchRec.Attr = 16) and (SearchRec.Name<>'.') and (SearchRec.Name<>'..')) then Result:=1 else Result:=2; end;Procedure TForm1.RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer); var i:integer; Subdir:TStringList; SearchRec:TsearchRec; begin //第一次调用FindFirst和FindNext查找符合要求的文件 if (FindFirst(CurrentDir+SearchFileType, faAnyFile, SearchRec)=0) then begin repeat if CurrentIsValidDir(SearchRec)=0 then begin Inc(Number); Searchresult.Add(CurrentDir+SearchRec.Name); end; application.ProcessMessages ; until (FindNext(SearchRec) <> 0); end; FindClose(SearchRec);//以下是递归部分,查找各子目录。 Subdir:=TStringList.Create; if (FindFirst(CurrentDir+'*.*', faDirectory, SearchRec)=0) then begin repeat if CurrentIsValidDir(SearchRec)=1 then begin Subdir.Add(SearchRec.Name); end; application.ProcessMessages ; until (FindNext(SearchRec) <> 0); end; FindClose(SearchRec); for i:=0 to Subdir.Count-1 do begin RecurSearchfile(CurrentDir+Subdir.Strings[i]+'\',SearchFileType,Searchresult,Number); end;//资源释放并返回结果。 Subdir.Free; end;procedure TForm1.ComboBox1Change(Sender: TObject); begin Case ComboBox1.ItemIndex of 0:SearchFileType:='*.txt'; 1:SearchFileType:='*.bmp'; 2:SearchFileType:='*.mp3'; 3:SearchFileType:='*.*'; end; end;procedure TForm1.Edit1Change(Sender: TObject); begin if Edit1.Text='' then BitBtn2.Enabled:=False else BitBtn2.Enabled:=True; end;procedure TForm1.BitBtn1Click(Sender: TObject); var SelectDir:string; begin if SelectDirectory(SelectDir, [sdAllowCreate, sdPerformCreate, sdPrompt],0) then begin if length(SelectDir) > 3 then SelectDir:=SelectDir+'\'; Edit1.Text:=SelectDir; end; end;procedure TForm1.BitBtn2Click(Sender: TObject); begin memo1.lines.Clear ; TotalFileNumbers:=0; RecurSearchFile(Edit1.Text,SearchFileType,memo1.lines, TotalFileNumbers); Label3.Caption:='查找结果显示:'+'一共在当前目录下找到'+IntToStr(TotalFileNumbers)+'个'+SearchFileType+'类型的文件'; end;procedure TForm1.BitBtn3Click(Sender: TObject); begin Close; end;end.
我的也贴出吧,最后文件名导入memo procedure TForm1.Button1Click(Sender: TObject); var s:tstringlist; begin s:=tstringlist.Create; getall('c:\tmp','*爱*.*',s); memo1.Lines.Assign(s); end;procedure TForm1.GetAll(const fpath,fname: String; filelist: TstringList); var i,j:integer; fs: TsearchRec; begin i:= findfirst(fpath+'\'+fname,faAnyFile-fadirectory,fs); //先寻找根目录下的文件 while i=0 do begin filelist.add(fpath+'\'+fs.name); i :=findnext(fs); end; FindClose(fs); //再逐个寻找子目录中的文件 j:= findfirst(fpath+'\'+'*.*',fadirectory,fs); while j=0 do begin if (fs.Name <> '.') and (fs.Name <> '..') then getall(fPath + '\'+fs.Name, fname,filelist); j :=findnext(fs); end; end;
加上一句 while j=0 do begin if (fs.Name <> '.') and (fs.Name <> '..') then if((fs.Attr and faDirectory)=faDirectory) then //忘记了,应该加上这一句判断是否是文件夹 getall(fPath + '\'+fs.Name, fname,filelist); j :=findnext(fs); end;
// 遍历某个文件夹下某种文件,
// 使用说明
// _GetFileList(ListBox1.Items,'c:\*.doc');
// _GetFileList(MyTStringList,'c:\*.exe');
// ================================================================
procedure TForm1._GetFileList(AStrings: TStrings ; ASourFile: string);
var sour_path,sour_file: string;
TmpList:TStringList;
FileRec:TSearchrec;
begin sour_path:=ExtractFilePath(ASourFile);
sour_file:=ExtractFileName(ASourFile); if not DirectoryExists(sour_path) then
begin
AStrings.Clear;
exit;
end; TmpList:=TStringList.Create;
TmpList.Clear; if FindFirst(sour_path+sour_file,faAnyfile,FileRec) = 0 then
repeat
if ((FileRec.Attr and faDirectory) = 0) then
begin
TmpList.Add(sour_path+FileRec.Name)
end;
until FindNext(FileRec)<>0; SysUtils.FindClose(FileRec); AStrings.Assign(TmpList); TmpList.Free;
end;
unit mainunit;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons,FileCtrl;type
TForm1 = class(TForm)
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
ComboBox1: TComboBox;
Edit1: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Label3: TLabel;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
public
function CurrentIsValidDir(SearchRec:TSearchRec):integer;
procedure RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer);
{ Public declarations }
end;var
Form1: TForm1;
TotalFileNumbers:Integer;
SearchFileType:String;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
TotalFileNumbers:=0;
SearchFileType:='*.txt';
end;function TForm1.CurrentIsValidDir(SearchRec:TSearchRec):integer;
begin
if ((SearchRec.Attr <> 16) and
(SearchRec.Name<>'.') and
(SearchRec.Name<>'..')) then
Result:=0
else if ((SearchRec.Attr = 16) and
(SearchRec.Name<>'.') and
(SearchRec.Name<>'..')) then
Result:=1
else
Result:=2;
end;Procedure TForm1.RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer);
var
i:integer;
Subdir:TStringList;
SearchRec:TsearchRec;
begin
//第一次调用FindFirst和FindNext查找符合要求的文件
if (FindFirst(CurrentDir+SearchFileType, faAnyFile, SearchRec)=0) then
begin
repeat
if CurrentIsValidDir(SearchRec)=0 then
begin
Inc(Number);
Searchresult.Add(CurrentDir+SearchRec.Name);
end;
application.ProcessMessages ;
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);//以下是递归部分,查找各子目录。
Subdir:=TStringList.Create;
if (FindFirst(CurrentDir+'*.*', faDirectory, SearchRec)=0) then
begin
repeat
if CurrentIsValidDir(SearchRec)=1 then
begin
Subdir.Add(SearchRec.Name);
end;
application.ProcessMessages ;
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);
for i:=0 to Subdir.Count-1 do
begin
RecurSearchfile(CurrentDir+Subdir.Strings[i]+'\',SearchFileType,Searchresult,Number);
end;//资源释放并返回结果。
Subdir.Free;
end;procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Case ComboBox1.ItemIndex of
0:SearchFileType:='*.txt';
1:SearchFileType:='*.bmp';
2:SearchFileType:='*.mp3';
3:SearchFileType:='*.*';
end;
end;procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text='' then
BitBtn2.Enabled:=False
else
BitBtn2.Enabled:=True;
end;procedure TForm1.BitBtn1Click(Sender: TObject);
var
SelectDir:string;
begin
if SelectDirectory(SelectDir, [sdAllowCreate, sdPerformCreate, sdPrompt],0) then
begin
if length(SelectDir) > 3 then
SelectDir:=SelectDir+'\';
Edit1.Text:=SelectDir;
end;
end;procedure TForm1.BitBtn2Click(Sender: TObject);
begin
memo1.lines.Clear ;
TotalFileNumbers:=0;
RecurSearchFile(Edit1.Text,SearchFileType,memo1.lines, TotalFileNumbers);
Label3.Caption:='查找结果显示:'+'一共在当前目录下找到'+IntToStr(TotalFileNumbers)+'个'+SearchFileType+'类型的文件';
end;procedure TForm1.BitBtn3Click(Sender: TObject);
begin
Close;
end;end.
procedure TForm1.Button1Click(Sender: TObject);
var s:tstringlist;
begin
s:=tstringlist.Create;
getall('c:\tmp','*爱*.*',s);
memo1.Lines.Assign(s);
end;procedure TForm1.GetAll(const fpath,fname: String; filelist: TstringList);
var
i,j:integer;
fs: TsearchRec;
begin
i:= findfirst(fpath+'\'+fname,faAnyFile-fadirectory,fs);
//先寻找根目录下的文件
while i=0 do
begin
filelist.add(fpath+'\'+fs.name);
i :=findnext(fs);
end;
FindClose(fs);
//再逐个寻找子目录中的文件
j:= findfirst(fpath+'\'+'*.*',fadirectory,fs);
while j=0 do
begin
if (fs.Name <> '.') and (fs.Name <> '..') then
getall(fPath + '\'+fs.Name, fname,filelist);
j :=findnext(fs);
end;
end;
while j=0 do
begin
if (fs.Name <> '.') and (fs.Name <> '..') then
if((fs.Attr and faDirectory)=faDirectory) then //忘记了,应该加上这一句判断是否是文件夹
getall(fPath + '\'+fs.Name, fname,filelist);
j :=findnext(fs);
end;