使用归递调用法,进行遍历目录,需要用FindFirstFile和FindNextFile进行搜索文件。
C++ Builder源码,delphi可以仿制:
#include <vcl.h>
#include <stdio.h>char CurrentDirectoryBuffer[256];
char OldDirectoryBuffer[256];
bool GetDirList(TStringList *TDirStr);
DWORD dwSize,dwFiles;
bool GetDirList(TStringList *TDirStr)
{
 WIN32_FIND_DATA FindData;
 HANDLE FindHandle;
 GetCurrentDirectory(255,CurrentDirectoryBuffer);
 FindHandle=FindFirstFile("*.*",&FindData);
 if(FindHandle==INVALID_HANDLE_VALUE) return false;
 do{
  if(!(FindData.dwFileAttributes&FILE_ATTRIBUTE_ENCRYPTED)&&
     !(FindData.dwFileAttributes&FILE_ATTRIBUTE_TEMPORARY)&&
     !(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)&&
     !(FindData.dwFileAttributes&FILE_ATTRIBUTE_SPARSE_FILE)&&
     !(FindData.dwFileAttributes&FILE_ATTRIBUTE_REPARSE_POINT)&&
     !(FindData.dwFileAttributes&FILE_ATTRIBUTE_COMPRESSED)&&
     !(FindData.dwFileAttributes&FILE_ATTRIBUTE_OFFLINE)){//   printf("%s\\%s\n",CurrentDirectoryBuffer,FindData.cFileName);
   dwFiles++;
   dwSize+=FindData.nFileSizeLow;   if(TDirStr){
    if(CurrentDirectoryBuffer[lstrlen(CurrentDirectoryBuffer)-1]!='\\')
     TDirStr->Add((AnsiString)CurrentDirectoryBuffer+"\\"+(AnsiString)FindData.cFileName);
    else
     TDirStr->Add((AnsiString)CurrentDirectoryBuffer+(AnsiString)FindData.cFileName);}}}
 while(FindNextFile(FindHandle,&FindData));
 FindClose(FindHandle);
 FindHandle=FindFirstFile("*.*",&FindData);
 if(FindHandle==INVALID_HANDLE_VALUE) return false;
 do{
  if(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY&&
     FindData.cFileName[0]!='.'){
  if(CurrentDirectoryBuffer[lstrlen(CurrentDirectoryBuffer)-1]!='\\')
   lstrcat(CurrentDirectoryBuffer,"\\");
  lstrcat(CurrentDirectoryBuffer,FindData.cFileName);
  SetCurrentDirectory(CurrentDirectoryBuffer);
  GetDirList(TDirStr);
  SetCurrentDirectory("..");
  GetCurrentDirectory(255,CurrentDirectoryBuffer);}}
 while(FindNextFile(FindHandle,&FindData));
 FindClose(FindHandle);
 return true;
}
void GetDirLists(LPCSTR lpPath,TStringList *TDirStr)
{
 MessageBeep(MB_OK);
 GetCurrentDirectory(255,OldDirectoryBuffer);
 SetCurrentDirectory(lpPath);
 GetDirList(TDirStr);
 SetCurrentDirectory(OldDirectoryBuffer);
}
void main()
{
 TStringList *TDirStr;
 int i;
 TDirStr=new TStringList;
 TDirStr->Clear();
 GetDirLists("c:\\",TDirStr);
 for(i=0;i<TDirStr->Count;i++)
  printf("%s\n",TDirStr->Strings[i].c_str());
 printf("Total %ld file(s) %ld Byte(s)\n",dwFiles,dwSize);
 delete TDirStr;
}

解决方案 »

  1.   

    delphi里不是有控件嘛!
    用filelistbox就可以了
      

  2.   

    procedure searchfile(path:string);//注意,path后面要有'\';
    var
      SearchRec:TSearchRec;
      found:integer;
    begin
      found:=FindFirst(path+'*.*',faAnyFile,SearchRec);
      while found=0 do
       begin
         if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') 
            and (SearchRec.Attr<>faDirectory) then
           ListBox1.Add(SearchRec.Name);
         found:=FindNext(SearchRec);
       end;
      FindClose(SearchRec);
    end;
        
      

  3.   

    上面一个只获取当前目录下所有文件,如果要获取该目录下的子目录的文件,看下面
    procedure SearchFile(path:string);
    var
      SearchRec:TSearchRec;
      found:integer;
    begin
      found:=FindFirst(path+'*.*',faAanyFile,SearchRec);
      while found=0 do
       begin
        if (SearchRec.Name<>'.') and (SearchRec.name<>'..) and
           (SearchRec.Name=faDirectory) then
          SearchFile(SearchRec.Name+'\')
        else
          LisBox1.Add(SearchRec.Name);
        found:=FindNext(SearchREc);
      end;
      FindClose(SearchRec);
    end;
      

  4.   

    先用
    chdir('ml'); //ml 为你想搜索的目录
    再调用
    procedure FindFile(BaoHan:integer);
    //搜索指定目录下文件,BaoHan=1 包含子目录
    var  Sr : TSearchRec;
         Err,i: integer;
         ml:string;
    Begin
     i:=0;
     Err:=FindFirst('*.*',$37,Sr);
     if sr.Name[1]='.' then Err:=FindNext(Sr) ;
     if sr.Name[1]='.' then Err:=FindNext(Sr) ;
     While (Err = 0) do begin
       Listbox1.add(ExpandFileName(Sr.Name));
       If (baohan=1)and((Sr.Attr and faDirectory)<>0)  then
         begin
          ChDir(Sr.Name); FindFile(1); ChDir('..') ;
         end;
       end;
       Err:=FindNext(Sr) ;
      end ;
    end;