如何用Delphi实现子目录级的文件查询

如何用Delphi实现子目录级的文件查询,第1张

在应用实践中 我们经常会用到文件查询功能 通过Win 中提供的查找功能 我们可以方便的找出磁盘上任何目录下的文件 其原因是该查找功能可以遍历指定目录下的所有子目录中的文件 从编程角度讲 它实现了子目录级的文件查询 其实 这项功能并不难实现 关键是能理解并掌握懙莨阍这种程序设计思路 本人用Delphi实现了该项功能(任意子目录级) 由于使用了懙莨阍 程序思路清判缺竖晰 代码量小

实现方法

. 获取当前目录下的所有下一级子目录

. 存入字符串列表中(Tstrings)

其中 用到了几个API函数

FindFirst 是找出指定目录下第一个文件或目录

FindNext 一般和FindFirst配合使用 用来找出下一个文件或目录

FindClose 用来关闭查询

(以上函数Delphi在线帮助中有详尽解释 在此不赘述)

. 用FileExists函数查找当前目录

. 寻找是否有满足条件的文件存在

. 依掘大次使各个子目录成为当前目录

. 递归调用本函数

. 释放资源

. 返回查询结果  

代码如下

从搜索记录中判断是否是子目录

function IsValidDir(SearchRec:TSearchRec):Booleanbegin if (SearchRec Attr= ) and (SearchRec Name<>) and (SearchRec Name<>) then Result:=True else Result:=Falseend

. 这是查询主体函数

参数介绍

Mainpath 指定的查询目录 Filename 欲查询的文件 Foundresult 返回的含完整路径的匹配文件(可能有多个) 如果有匹配文件 函数返回True 否则 返回False  function SearchFile(mainpath:stringfilename:stringvar foundresult:TStrings):Booleanvar i:integerFound:Booleansubdir :TStringssearchRec:TsearchRecbegin found:=falseif Trim(filename)<>then begin subdir :=TStringList Create//字符串列表必须动态生成 //找出所有下级扮液子目录 if (FindFirst(mainpath+ * * faDirectory SearchRec)= ) then begin if IsValidDir(SearchRec) then subdir Add(SearchRec Name)while (FindNext(SearchRec) = ) do begin if IsValidDir(SearchRec) then subdir Add(SearchRec Name)endendFindClose(SearchRec)//查找当前目录 if FileExists(mainpath+filename) then begin found:=truefoundresult Add(mainpath+filename)end//这是递归部分 查找各子目录 for i:= to subdir Count do found:=Searchfile(mainpath+subdir Strings[i]+ \ Filename foundresult)or found//资源释放并返回结果 subdir Freeendresult:=foundend

  lishixinzhi/Article/program/Delphi/201311/8417

procedure EnumFileInQueue(path: PCharfileExt: stringfileList: TStringList)

var

searchRec: TSearchRec

found: Integer

tmpStr: string

curDir: string

dirs: TQueue

pszDir: PChar

begin

dirs := TQueue.Create//创建目录队列

dirs.Push(path)//将起始搜索路径入队

pszDir := dirs.Pop

curDir := StrPas(pszDir)//出队

{开始遍历,直至队列为空(即没有目录需要遍历)}

while (True) do

begin

//加上搜索后缀,得到类似'c:\*.*' 、'c:\windows\*.*'的搜索路径

tmpStr := curDir + '\*.*'

//在当前目录查找第一个文件、子目录

found := FindFirst(tmpStr, faAnyFile, searchRec)

while found = 0 do //找到了一个文件或目录后

begin

//如果找到的是个目举和录

if (searchRec.Attr and faDirectory) <>0 then

begin

{在搜索非根目录(C:\、D:\)下的子目录时会出现'.','..'的"虚拟目录"

大概是表示上层目录和下层目录吧。。。要过滤掉才可以}

if (searchRec.Name <>'.') and (searchRec.Name <>'..') then

begin

{由于查找到的子目录只有个目录名,所以要添上上层目录的路径

searchRec.Name = 'Windows'

tmpStr:='c:\Windows'

加个断点就一清二楚了

}

tmpStr := curDir + '\' + searchRec.Name

{将搜索到的目录入队。让它先晾着。

因为TQueue里面的数据只能是指针,所以要把string转换为PChar

同时使用StrNew函数重新申请一个空间存入数据,否则会使已经进

入队列的指针指向不存在或不正确的数据(tmpStr是局部变量)。}

dirs.Push(StrNew(PChar(tmpStr)))

end

end

else //如果找到的是个文件

begin

{Result记录着搜索到的文件正运盯数。可是我是用CreateThread创建线程

来调用函数的,不知道怎么得到这个返回值。。。我不想用全局变量}

//把找到的文件加到Memo控件

if fileExt = '.*' then

fileList.Add(curDir + '\' + searchRec.Name)

else

begin

if SameText(RightStr(curDir + '\' + searchRec.Name, Length(fileExt)), fileExt) then

fileList.Add(curDir + '\' + searchRec.Name)

end

end

//查找下一个文件或目录

found := FindNext(searchRec)

end

{当前目录找到后,如果队列中没有数据,则表示全部找到了;

否则就是还有子目悄掘录未查找,取一个出来继续查找。}

if dirs.Count >0 then

begin

pszDir := dirs.Pop

curDir := StrPas(pszDir)

StrDispose(pszDir)

end

else

break

end

//释放资源

dirs.Free

FindClose(searchRec)

end

//调用

procedure TForm1.Button1Click(Sender: TObject)

var

dir: string

FileNameList: TStringList

begin

dir := trim(Edit1.Text)

FileNameList := TStringList.Create

//EnumFileInQueue(PChar(dir), '.*', FileNameList)

EnumFileInQueue(PChar(dir), '.*', FileNameList)

ShowMessage(IntToStr(FileNameList.Count))

FileNameList.Free

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12147430.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存