使用findfirst实现层级查询指定的文件

whw123 2004-09-17 05:46:19
使用findfirst执行如下的语句如:findfirst('c:\*爱*.*',faAnyFile,sr)仅仅在c: 的根目录下面执行查询,而现在我想在c:\和c:\的所有子目录中进行查询,如何进行,也就是需要传递两个参数,一个是初始的目录,另外一个就是我要查询的文件名称得部分文件名。那位老大能够实现。请不吝赐教。
...全文
174 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lw549 2004-09-18
  • 打赏
  • 举报
回复
深度优先遍历算法,呵呵
zdq801104 2004-09-18
  • 打赏
  • 举报
回复
如果通过的话,可比我的好多了
zdq801104 2004-09-18
  • 打赏
  • 举报
回复
drift1981(一包香烟,一把吉他,浪迹天涯!) 老大,你比我的短多了
whw123 2004-09-17
  • 打赏
  • 举报
回复
非常感谢以上几位的帮助。我马上测试,如果通过,立即结贴
drift1981 2004-09-17
  • 打赏
  • 举报
回复
加上一句
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;
drift1981 2004-09-17
  • 打赏
  • 举报
回复
我的也贴出吧,最后文件名导入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;
zdq801104 2004-09-17
  • 打赏
  • 举报
回复
要原码的话找我:QQ:178758908
zdq801104 2004-09-17
  • 打赏
  • 举报
回复
你看看这个,查找文件的代码:
unit mainunit;

interface

uses
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.
wilowind 2004-09-17
  • 打赏
  • 举报
回复
// ================================================================
// 遍历某个文件夹下某种文件,
// 使用说明
//  _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;
todouwang 2004-09-17
  • 打赏
  • 举报
回复
sorry,我回家试一下。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧