使用findfirst执行如下的语句如:findfirst('c:\*爱*.*',faAnyFile,sr)仅仅在c: 的根目录下面执行查询,而现在我想在c:\和c:\的所有子目录中进行查询,如何进行,也就是需要传递两个参数,一个是初始的目录,另外一个就是我要查询的文件名称得部分文件名。那位老大能够实现。请不吝赐教。

解决方案 »

  1.   

    // ================================================================
    // 遍历某个文件夹下某种文件,
    // 使用说明
    //       _GetFileList(ListBox1.Items,'c:\*.doc');
    //           _GetFileList(MyTStringList,'c:\*.exe');
    // ================================================================
    procedure TForm1._GetFileList(AStrings: TStrings ; ASourFile: string);
    var sour_path,sour_file: string;
        TmpList:TStringList;
        FileRec:TSearchrec;
    begin   sour_path:=ExtractFilePath(ASourFile);
       sour_file:=ExtractFileName(ASourFile);   if not DirectoryExists(sour_path) then
       begin
         AStrings.Clear;
         exit;
       end;   TmpList:=TStringList.Create;
       TmpList.Clear;   if FindFirst(sour_path+sour_file,faAnyfile,FileRec) = 0 then
       repeat
          if ((FileRec.Attr and faDirectory) = 0) then
             begin
               TmpList.Add(sour_path+FileRec.Name)
             end;
       until FindNext(FileRec)<>0;   SysUtils.FindClose(FileRec);   AStrings.Assign(TmpList);   TmpList.Free;
    end;
      

  2.   

    你看看这个,查找文件的代码:
    unit mainunit;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons,FileCtrl;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Label1: TLabel;
        Label2: TLabel;
        ComboBox1: TComboBox;
        Edit1: TEdit;
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        BitBtn3: TBitBtn;
        Label3: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure ComboBox1Change(Sender: TObject);
        procedure Edit1Change(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
      private
        { Private declarations }
      public
        function CurrentIsValidDir(SearchRec:TSearchRec):integer;
        procedure RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer);
        { Public declarations }
      end;var
      Form1: TForm1;
      TotalFileNumbers:Integer;
      SearchFileType:String;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
     TotalFileNumbers:=0;
     SearchFileType:='*.txt';
    end;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;procedure TForm1.ComboBox1Change(Sender: TObject);
    begin
     Case ComboBox1.ItemIndex of
      0:SearchFileType:='*.txt';
      1:SearchFileType:='*.bmp';
      2:SearchFileType:='*.mp3';
      3:SearchFileType:='*.*';
     end;
    end;procedure TForm1.Edit1Change(Sender: TObject);
    begin
     if Edit1.Text='' then
      BitBtn2.Enabled:=False
     else
      BitBtn2.Enabled:=True; 
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    var
     SelectDir:string;
    begin
     if SelectDirectory(SelectDir, [sdAllowCreate, sdPerformCreate, sdPrompt],0) then
      begin
       if length(SelectDir) > 3 then
        SelectDir:=SelectDir+'\';
       Edit1.Text:=SelectDir;
      end;
    end;procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
     memo1.lines.Clear ;
     TotalFileNumbers:=0;
     RecurSearchFile(Edit1.Text,SearchFileType,memo1.lines, TotalFileNumbers);
     Label3.Caption:='查找结果显示:'+'一共在当前目录下找到'+IntToStr(TotalFileNumbers)+'个'+SearchFileType+'类型的文件';
    end;procedure TForm1.BitBtn3Click(Sender: TObject);
    begin
     Close;
    end;end.
      

  3.   

    我的也贴出吧,最后文件名导入memo
    procedure TForm1.Button1Click(Sender: TObject);
    var s:tstringlist;
    begin
    s:=tstringlist.Create;
    getall('c:\tmp','*爱*.*',s);
    memo1.Lines.Assign(s);
    end;procedure TForm1.GetAll(const fpath,fname: String; filelist: TstringList);
    var
       i,j:integer;
       fs: TsearchRec;
    begin
    i:= findfirst(fpath+'\'+fname,faAnyFile-fadirectory,fs);
    //先寻找根目录下的文件
    while i=0 do
    begin
     filelist.add(fpath+'\'+fs.name);
     i :=findnext(fs);
    end;
    FindClose(fs);
    //再逐个寻找子目录中的文件
    j:= findfirst(fpath+'\'+'*.*',fadirectory,fs);
    while j=0 do
    begin
       if (fs.Name <> '.') and (fs.Name <> '..') then
          getall(fPath + '\'+fs.Name, fname,filelist);
     j :=findnext(fs);
    end;
    end;
      

  4.   

    加上一句
    while j=0 do
    begin
       if (fs.Name <> '.') and (fs.Name <> '..') then
           if((fs.Attr and faDirectory)=faDirectory) then //忘记了,应该加上这一句判断是否是文件夹
          getall(fPath + '\'+fs.Name, fname,filelist);
     j :=findnext(fs);
    end;
      

  5.   

    drift1981(一包香烟,一把吉他,浪迹天涯!) 老大,你比我的短多了