delphi中如何遍历查找文件夹下的某文件名

delphi中如何遍历查找文件夹下的某文件名,第1张

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

#include <windows.h>

/************************************************/

*参数说明:

char *pszDestPath为需要遍历的目标路径

/************************************************/

EnmuDirectory(char *pszDestPath)

{

//此结构说明参MSDN

WIN32_FIND_DATA FindFileData

//查找文件的句柄

HANDLE hListFile

//绝对路径,例:c:\windows\system32\cmd.exe

char szFullPath[MAX_PATH]

//相对路径

char szFilePath[MAX_PATH]

//构造相对路径

wsprintf(szFilePath, "%s\\*", pszDestPath)

//查找第一个文件,获得查找句柄,如果FindFirstFile返回INVALID_HANDLE_VALUE则返回

if((hListFile = FindFirstFile(szFilePath, &FindFileData)) == INVALID_HANDLE_VALUE)

{

//查找文件错误

return 1

}

else

{

do

{

//过滤.和..

//“.”代表本级目录“..”代表父级目录

if( lstrcmp(FindFileData.cFileName, TEXT(".")) == 0 ||

lstrcmp(FindFileData.cFileName, TEXT("..")) == 0 )

{

continue

}

//构造全路径

wsprintf(szFullPath, "%s\\%s", pszDestPath, FindFileData.cFileName)

//读取文件属性,如果不是文件夹

if(!(FindFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY))

{

//这里你可以自己添加分析是某种类型文件的代码。可以根据

//扩展名分析。

//这里有个实例,你可以看看

//有必要初始化一下

char *pszFileType = NULL

//把pszFileType指向cFileName的倒数第三个数符。因为一般扩展名长为3个字符。

//当然,你也可以用其它方法分析扩展名。或倒序查“.”

pszFileType = &(FindFileData.cFileName[strlen(FindFileData.cFileName) - 3])

//如果是jpg结尾的文件

if(!stricmp(pszFileType, "jpg"))

{

FILE *fp

//或许这里打开C:\\data.txt不应该用"w+",你可试着来

fp = fopen("c:\\data.txt", "w+")

if(fp) fputs(szFullPath, fp)

fclose(fp)

}

}

//如果是文件夹,则递归调用EnmuDirectory函数

if(FindFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)

{

EnmuDirectory(szFullPath)

}

//循环,查找下一个文件

}while(FindNextFile(hListFile, &FindFileData))

}

//关闭句柄

FindClose(hListFile)

//清空结构。可有可无的一句代码。函数退出会自动清空。

ZeroMemory(&FindFileData, sizeof(FindFileData))

return 0

}

这是windows api版的,还有MFC版的和C版的。要的话来找我Q:503267714


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存