Delphi 遍历所有目录和子目录下的文件名(可按后缀名遍历)



procedure EnumFileInQueue(path: PChar; fileExt: string; fileList: 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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
function MoveFile(const sName, dName: string): Boolean; {* 移动文件目录,参数为源、目标名} procedure FileProperties(const FName: string); {* 打开文件属性窗口} function OpenDialog(var FileName: string; Title: string; Filter: string; Ext: string): Boolean; {* 打开文件框} function FormatPath(APath: string; Width: Integer): string; {* 缩短显示不下的长路径名} function GetRelativePath(Source, Dest: string): string; {* 取两个目录的相对路径,注意串尾不能是'\'字符!} procedure RunFile(const FName: string; Handle: THandle = 0; const Param: string = ''); {* 运行一个文件} function WinExecAndWait32(FileName: string; Visibility: Integer = SW_NORMAL): Integer; {* 运行一个文件并等待其结束} function AppPath: string; {* 应用程序路径} function GetWindowsDir: string; {* 取Windows系统目录} function GetWinTempDir: string; {* 取临时文件目录} function AddDirSuffix(Dir: string): string; {* 目录尾加'\'修正} function MakePath(Dir: string): string; {* 目录尾加'\'修正} function IsFileInUse(FName: string): Boolean; {* 判断文件是否正在使用} function GetFileSize(FileName: string): Integer; {* 取文件长度} function SetFileDate(FileName: string; CreationTime, LastWriteTime, LastAccessTime: TFileTime): Boolean; {* 设置文件时间} function GetFileDate(FileName: string; var CreationTime, LastWriteTime, LastAccessTime: TFileTime): Boolean; {* 取文件时间} function FileTimeToLocalSystemTime(FTime: TFileTime): TSystemTime; {* 文件时间转本地时间} function LocalSystemTimeToFileTime(STime: TSystemTime): TFileTime; {* 本地时间转文件时间} function GetFileIcon(FileName: string; var Icon: TIcon): Boolean; {* 取得与文件相关的图标,成功则返回True} function CreateBakFile(FileName, Ext: string): Boolean; {* 创建备份文件} function Deltree(Dir: string): Boolean; {* 删除整个目录} function GetDirFiles(Dir: string): Integer; {* 取文件文件数} type TFindCallBack = procedure(const FileName: string; const Info: TSearchRec; var Abort: Boolean); {* 查找指定目录文件的回调函数} procedure FindFile(const Path: string; const FileName: string = '*.*'; Proc: TFindCallBack = nil; bSub: Boolean = True; const bMsg: Boolean = True); {* 查找指定目录文件} function OpenWith(const FileName: string): Integer; {* 文件打开方式} //----------------------------------------------------------------------------// //扩展的字符串操作函数 // //----------------------------------------------------------------------------// function InStr(const sShort: string; const sLong: string): Boolean; {* 判断s1是否包含在s2中} function IntToStrEx(Value: Integer; Len: Integer; FillChar: Char = '0'): string; {* 扩展整数转字符串函数} function IntToStrSp(Value: Integer; SpLen: Integer = 3; Sp: Char = ','): string; {* 带分隔符的整数-字符转换} function ByteToBin(Value: Byte): string; {* 字节转二进制串} function StrRight(Str: string; Len: Integer): string; {* 返回字符串右边的字符} function StrLeft(Str: string; Len: Integer): string; {* 返回字符串左边的字符} function Spc(Len: Integer): string; {* 返回空格串} procedure SwapStr(var s1, s2: string); {* 交换字串} function LinesToStr(const Lines: string): string; {* 多行文本转单行(换行符转'\n')} function StrToLines(const Str: string): string; {* 单行文本转多行('\n'转换行符)} //----------------------------------------------------------------------------// //扩展的对话框函数 // //----------------------------------------------------------------------------// procedure InfoDlg(Mess: string; Caption: string = SCnInformation; Flags: Integer = MB_OK + MB_ICONINFORMATION); {* 显示提示窗口} function InfoOk(Mess: string; Caption: string = SCnInformation): Boolean; {* 显示提示确认窗口} procedure ErrorDlg(Mess: string; Caption: string = SCnError); {* 显示错误窗口} procedure WarningDlg(Mess: string; Caption: string = SCnWarning); {* 显示警告窗口} function QueryDlg(Mess: string; Caption: string = SCnInformation): Boolean; {* 显示查询是否窗口} //----------------------------------------------------------------------------// //扩展日期时间操作函数 // //----------------------------------------------------------------------------// function GetYear(Date: TDate): Integer; {* 取日期年份分量} function GetMonth(Date: TDate): Integer; {* 取日期月份分量} function GetDay(Date: TDate): Integer; {* 取日期天数分量} function GetHour(Time: TTime): Integer; {* 取时间小时分量} function GetMinute(Time: TTime): Integer; {* 取时间分钟分量} function GetSecond(Time: TTime): Integer; {* 取时间秒分量} function GetMSecond(Time: TTime): Integer; {* 取时间毫秒分量} //----------------------------------------------------------------------------// //位操作函数 // //----------------------------------------------------------------------------// type TByteBit = 0..7; {* Byte类型位数范围} TWordBit = 0..15; {* Word类型位数范围} TDWordBit = 0..31; {* DWord类型位数范围} procedure SetBit(var Value: Byte; Bit: TByteBit; IsSet: Boolean); overload; {* 设置二进制位} procedure SetBit(var Value: WORD; Bit: TWordBit; IsSet: Boolean); overload; {* 设置二进制位} procedure SetBit(var Value: DWORD; Bit: TDWordBit; IsSet: Boolean); overload; {* 设置二进制位} function GetBit(Value: Byte; Bit: TByteBit): Boolean; overload; {* 取二进制位} function GetBit(Value: WORD; Bit: TWordBit): Boolean; overload; {* 取二进制位} function GetBit(Value: DWORD; Bit: TDWordBit): Boolean; overload; {* 取二进制位} //----------------------------------------------------------------------------// //系统功能函数 // //----------------------------------------------------------------------------// procedure MoveMouseIntoControl(AWinControl: TControl); {* 移动鼠标到控件} function DynamicResolution(x, y: WORD): Boolean; {* 动态设置分辨率} procedure StayOnTop(Handle: HWND; OnTop: Boolean); {* 窗口最上方显示} procedure SetHidden(Hide: Boolean); {* 设置程序是否出现在任务栏} procedure SetTaskBarVisible(Visible: Boolean); {* 设置任务栏是否可见} procedure SetDesktopVisible(Visible: Boolean); {* 设置桌面是否可见} procedure BeginWait; {* 显示等待光标} procedure EndWait; {* 结束等待光标} function CheckWindows9598: Boolean; {* 检测是否Win95/98平台} //----------------------------------------------------------------------------// //其它过程 // //----------------------------------------------------------------------------// function TrimInt(Value, Min, Max: Integer): Integer; overload; {* 输出限制在Min..Max之间} function IntToByte(Value: Integer): Byte; overload; {* 输出限制在0..255之间} function InBound(Value: Integer; Min, Max: Integer): Boolean; {* 判断整数Value是否在Min和Max之间} procedure CnSwap(var A, B: Byte); overload; {* 交换两个数} procedure CnSwap(var A, B: Integer); overload; {* 交换两个数} procedure CnSwap(var A, B: Single); overload; {* 交换两个数} procedure CnSwap(var A, B: Double); overload; {* 交换两个数} function RectEqu(Rect1, Rect2: TRect): Boolean; {* 比较两个Rect是否相等} procedure DeRect(Rect: TRect; var x, y, Width, Height: Integer); {* 分解一个TRect为左上角坐标x, y和宽度Width、高度Height} function EnSize(cx, cy: Integer): TSize; {* 返回一个TSize类型} function RectWidth(Rect: TRect): Integer; {* 计算TRect的宽度} function RectHeight(Rect: TRect): Integer; {* 计算TRect的高度} procedure Delay(const uDelay: DWORD); {* 延时} procedure BeepEx(const Freq: WORD = 1200; const Delay: WORD = 1); {* 在Win9X下让喇叭发声} procedure ShowLastError; {* 显示Win32 Api运行结果信息} function GetHzPy(const AHzStr: string): string; {* 取汉字的拼音} function SoundCardExist: Boolean; {* 声卡是否存在}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值