我知道怎么在某个目录里搜索1个指定文件名的文件。但如果要搜索多个文件 应该在哪个地方做改进?搜索多个文件的话是不是要建一个TStringList,把所有要查找的文件名都存入这个字符串列表中,再做个循环 for i:=0 to StringList.count-1 do,在这个循环中在findfirst,findnext, 我现在的想法就是这样,但不好检验,也不知道对不对,因为搜索还有个效率的问题,我不知道这样的效率怎样,大家可以给点意见吗?搜索指定的某个文件的代码如下
function CurrentIsValidDir(SearchRec:TSearchRec):integer;
procedure RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer);function TForm1.CurrentIsValidDir(SearchRec:TSearchRec):integer;//这是检验文件夹是否合法
begin
if ((SearchRec.Attr <> 16) and
    (SearchRec.Name<>'.')  and
    (SearchRec.Name<>'..')) then
  Result:=0
  else if ((SearchRec.Attr = 16) and
           (SearchRec.Name<>'.') and
           (SearchRec.Name<>'..')) then
  Result:=1
  else
  Result:=2;
end;Procedure TForm1.RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer);
var
 i:integer;
 Subdir:TStringList;
 SearchRec:TsearchRec;
begin
//调用FindFirst和FindNext查找符合要求的文件
 if (FindFirst(CurrentDir+SearchFileType, faAnyFile, SearchRec)=0) then
  begin
   repeat
    if CurrentIsValidDir(SearchRec)=0 then
      begin
       Inc(Number);
       Searchresult.Add(CurrentDir+SearchRec.Name);
      end;
    application.ProcessMessages ;
   until (FindNext(SearchRec) <> 0);
  end;
 FindClose(SearchRec);//查找各子目录。
 Subdir:=TStringList.Create;
 if (FindFirst(CurrentDir+'*.*', faDirectory, SearchRec)=0) then
  begin
   repeat
    if CurrentIsValidDir(SearchRec)=1 then
     begin
      Subdir.Add(SearchRec.Name);
     end;
    application.ProcessMessages ;
   until (FindNext(SearchRec) <> 0);
  end;
 FindClose(SearchRec);
 for i:=0 to Subdir.Count-1 do
  begin
   RecurSearchfile(CurrentDir+Subdir.Strings[i]+'\',SearchFileType,Searchresult,Number);
  end; Subdir.Free;
end;

解决方案 »

  1.   

    我的和一 楼的差不多,其实就是这个原理。关键是几个函数:FindFirst、FindNext最值得注意的是SearchRec的定义。没有这个定义是不行的。
      

  2.   

    共检索到 6 个记录,用时 62.5 微秒。 
    调用api函数,将一个目录下的所有文件名读出? 
    ID=1838115, 发贴富翁: liu2909432, 发贴时间:2003-5-10 5:38:00调用api函数,将一个目录下的所有文件名读出?
    急!急!
    RE: 调用api函数,将一个目录下的所有文件名读出?
    ID=1838591, 发贴富翁: 太阳火, 发贴时间:2003-5-7 9:15:00不是用api函数。
    用TSearchRec结构。自己看看帮助,或者搜索一下以前的帖子,太多了!
    RE: 调用api函数,将一个目录下的所有文件名读出?
    ID=1838617, 发贴富翁: jrq, 发贴时间:2003-5-7 9:22:00刚好手边有,贴上来供参考://+-------------------------------------------+
    //|       得到指定路径下的所有文件列表        |
    //+-------------------------------------------+
    function Get_File(Path:string):TStrings; //Path就是制定的路径,得到文件的列表以TStrings返回
    const FileAttrs = faAnyFile and (not fadirectory);
    var
      SRec: TSearchRec;
      FindResult:Integer;
    begin
       Result:=TStringList.Create;  
       FindResult:=FindFirst (Path+'\'+'*.*', FileAttrs, SRec);
                                     //^^^^^------此处可以进行文件类型的过滤
       while FindResult= 0 do
          begin
             if (SRec.Name <> '.') and (SRec.Name <> '..') then  
                begin
                   Result.Add(SRec.Name);
                   FindResult:=FindNext(SRec);
                end;
          end;
       FindClose (SRec);
    end;
     
      

  3.   

    procedure TForm1.MakeTree(path: string);
    { 子目录遍历的递归算法 }
    var sr : TSearchRec;
        err: integer;
    begin
      chdir(path);
      err := findfirst('*.*', faAnyFile, sr);
      while err = 0 do begin
        if (sr.Name <> '.')and(sr.Name <> '..') then
          if (sr.Attr and faDirectory)<>0 then begin
            inc(dCount);
            MakeTree((sr.Name));
            chdir('..');
          end
          else inc(fCount);
        err := findnext(sr);
      end;
      findclose(sr);
    end;
      

  4.   

    if (FindFirst(CurrentDir+'*.*', faDirectory, SearchRec)=0) then
    改成
    if (FindFirst(CurrentDir+'*.asp;*.bin;*.exe;*.dll;*.ocx', faDirectory, SearchRec)=0) then
    这样就可以啊。