实现方法
. 获取当前目录下的所有下一级子目录
. 存入字符串列表中(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/8417procedure 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)