unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
procedure search(dir:string);//自定义函数Var
targetpath:string;
sr:TsearchRec;
begin
  targetpath:=extractfilepath(dir);
  if findfirst(dir,faanyfile,sr)=0 then
  repeat
   if (sr.Name<>'.')and(sr.Name<>'..')
      and ((filegetattr(targetpath+sr.name)and fadirectory)<>fadirectory)
   then
      form1.Memo1.Lines.Add(targetpath+sr.name); //在MEMO中添加找到的文件
   until findnext(sr)<>0;
   //以下一段内容我试了可以不要也能正常运行,这是我感到奇怪的地方,那为什么书还要加上这段内容呢,虽然加上它程序也没有问题   if findfirst(dir,faanyfile,sr)=0 then
   repeat
     if((sr.name<>'.')and (sr.name<>'..'))
       and ((filegetattr(targetpath+sr.name)and fadirectory)<>fadirectory)
     then search(targetpath+sr.name+'\*.*');
   until findnext(sr)<>0;end;procedure TForm1.Button1Click(Sender: TObject);
begin
    memo1.Clear; //清除数据表MEMO字段内容
    search(Edit1.Text);{调用Search()函数}
    MessageDlg('文件搜索完毕!',mtInformation,[mbOk],0);{结束提示}
end;end.这段程序有几处看不懂的地方用下划线表示了,希望那位大侠给看看,指点指点
例外可否告诉我最后绿色部分函数的原型,我看help有些看不懂。先谢谢了。

解决方案 »

  1.   

    这段话是为了嵌套调用,但是代码写的不好'.'和'..'是判断找到的是否是上级目录或根目录,fadirectory是一个属性,代表是不是文件夹MessageDlg,你要啥原型,帮助中说的很清楚
      

  2.   

    我理解了这个点点的意思,就是相当于一种文件夹吧,fadirectory在书上说的是‘目录(注)’,我想和点点的意思是不是相同呢?
    还有filegetattr中的sr是之前搜索到的第一个文件的名字,即然它已经代表名字,为什么要用.Name而不直接用sr呢?下面那段嵌套,我试了试,不要,也可以实现找某个路径下的所有文件,为什么它书上偏要写上这段内容呢??搞不懂我在帮助的搜索和索引里都试着搜过MesageDlg,可是出来的不是我想要的内容,看来这个帮助我还不大会用哦,麻烦这位好心的大侠再帮帮忙,解答解答吧
      

  3.   

    fadirectory代表搜索的的是文件夹
    if findfirst(dir,faanyfile,sr)=0 then 
      repeat 
        if((sr.name <>'.')and (sr.name <>'..')) 
          and ((filegetattr(targetpath+sr.name)and fadirectory) <>fadirectory) 
        then search(targetpath+sr.name+'\*.*'); 
      until findnext(sr) <>0; 
    这段代码写错了,应该是:
    if((sr.name <>'.')and (sr.name <>'..')) 
          and ((filegetattr(targetpath+sr.name)and fadirectory) =fadirectory) 
        then search(targetpath+sr.name+'\*.*'); 
    判断是否是文件夹,然后递归调用此函数,用于搜索子文件夹,直到没有文件夹为止。前段是搜索文件。
      

  4.   

    顶,楼主的代码
    if((sr.name <>'.')and (sr.name <>'..'))
          and ((filegetattr(targetpath+sr.name)and fadirectory) <>fadirectory)
        then
    是不是应该是
    if((sr.name <>'.')and (sr.name <>'..'))
          and ((filegetattr(targetpath+sr.name)and fadirectory) =fadirectory)
        then
    这样的话就是在搜索子目录,你搜索的地方没有子目录,所以结果会一致
      

  5.   

    谢谢各位大侠!!我已经明白了。下面做一下陈述:if findfirst(dir,faanyfile,sr)=0 then //找符合通配符*.*的文件,fadirectory目录文件夹也算文件  
      repeat 
        if (sr.Name <>'.')and(sr.Name <>'..') //排除本级目录和上级目录
          and ((filegetattr(targetpath+sr.name)and fadirectory) <>fadirectory) //排除目录文件夹(怎么感觉和本级目录相似呵?)  
        then form1.Memo1.Lines.Add(targetpath+sr.name); //在MEMO中添加找到的文件 
      until findnext(sr) <>0; //直到此路径的所有文件都显示完毕
    {利用递归,找出路径下的所有文件夹的所有文件}
      if findfirst(dir,faanyfile,sr)=0 then 
      repeat 
        if((sr.name <>'.')and (sr.name <>'..')) 
          and ((filegetattr(targetpath+sr.name)and fadirectory) =fadirectory) 
        then search(targetpath+sr.name+'\*.*'); 
      until findnext(sr) <>0; [color=#FF9900]并且是先显示输入路径的下的所有文件,然后再显示此路径下文件夹的文件。[/color]
    大致情况就是这样的。对吧