delphi中FindFirst,FindNext,FindClose函数的用法和意义

时间:2021-10-30 20:20:49
以及各个函数的参数和返回值的意思,我是个新手,将详细点,大神帮帮忙!

4 个解决方案

#1


使用FindFirst函数和FindNext函数,可以遍历一个本地路径下的所有文件,包括目录文件的卷文件,文件名过滤条件在path中指定,这个就不多说了,我想说下对参数Attr意义的理解。

Attr 参数指定了对查找文件的属性的一个过滤,但这个过滤并不是一个正向的条件,即它的意义并不是说“我要查找×××条件的文件”,而是一个反向的过滤,即是说查找结果中可以包含条件属性的文件,既然是反向条件,那么他的过滤整体范围有多大呢?这个就需要我们看看源码了。

 

function FindFirst(const Path: string; Attr: Integer;
  var  F: TSearchRec): Integer;
const
  faSpecial = faHidden or faSysFile or faVolumeID or faDirectory;
{$IFDEF MSWINDOWS}
begin
  F.ExcludeAttr := not Attr and faSpecial;
  F.FindHandle := FindFirstFile(PChar(Path), F.FindData);
  if F.FindHandle <> INVALID_HANDLE_VALUE then
  begin
    Result := FindMatchingFile(F);
    if Result <> 0 then FindClose(F);
  end else
    Result := GetLastError;
end;
{$ENDIF}
{$IFDEF LINUX}
begin
  F.ExcludeAttr := not Attr and faSpecial;
  F.PathOnly := ExtractFilePath(Path);
  F.Pattern := ExtractFileName(Path);
  if F.PathOnly = '' then
    F.PathOnly := IncludeTrailingPathDelimiter(GetCurrentDir);

  F.FindHandle := opendir(PChar(F.PathOnly));
  if F.FindHandle <> nil then
  begin
    Result := FindMatchingFile(F);
    if Result <> 0 then
      FindClose(F);
  end
  else
    Result:= GetLastError;
end;
{$ENDIF}

 

从这里我们可以看到,在windows系统中,默认的过滤范围是

faSpecial = faHidden or faSysFile or faVolumeID or faDirectory;

即查找结果中默认不会显示 隐藏文件,系统文件,卷文件和目录文件,如果想在结果中包含这些属性的文件,就需要在Attr中给予明确的指明。

 

比如,要想查出路径下所有的目录,就需要让Attr至少包含faDirectory的值(Attr参数为整型,各个属性值之间按位与的关系),当然,这样查出来的结果中,也可能会包含一些其他的非目录文件,即只要文件不是 隐藏,系统和卷文件,结果中就会显示。另一方面,如果一个文件虽然是目录文件,但该目录是隐藏的,那么结果中也是不会显示的。

总之,如果不是有特别的要求,尽量还是使用faAnyFile参数,将文件查询出来以后再通过TSearchRec的Attr参数做进一步的处理。

#2


查找文件,不会可以看帮助或google

#3


哥晕了,偌大的一个中国青年软件论坛论坛(我看就是一个绣花枕头),一个小问题扔上面好几天没动静,难道是分数少了么,伤心。。。。。。
要么就是在百度上复制粘贴,要么说了就等于没说。。。一楼的答案我已经在百度上复制过的,一字不差,他妈的长篇大论谁不会啊,帮助别人有点真心好不。。。。

#4


procedure TForm1.Button1Click(Sender: TObject);
var
   TFileInfo:TSearchRec;
   hFile:HWND;
   b:Boolean;
begin
   hFile:=FindFirst('G:\\*.exe',faAnyFile,TFileInfo);
   if hFile=0 then Memo1.Lines.Add('没打开');
   Memo1.Lines.Add(TFileInfo.Name);
   while hFile=0 do begin

     hFile:=findnext(TFileInfo);
     Memo1.Lines.Add(TFileInfo.Name);
   end;
end;

#1


使用FindFirst函数和FindNext函数,可以遍历一个本地路径下的所有文件,包括目录文件的卷文件,文件名过滤条件在path中指定,这个就不多说了,我想说下对参数Attr意义的理解。

Attr 参数指定了对查找文件的属性的一个过滤,但这个过滤并不是一个正向的条件,即它的意义并不是说“我要查找×××条件的文件”,而是一个反向的过滤,即是说查找结果中可以包含条件属性的文件,既然是反向条件,那么他的过滤整体范围有多大呢?这个就需要我们看看源码了。

 

function FindFirst(const Path: string; Attr: Integer;
  var  F: TSearchRec): Integer;
const
  faSpecial = faHidden or faSysFile or faVolumeID or faDirectory;
{$IFDEF MSWINDOWS}
begin
  F.ExcludeAttr := not Attr and faSpecial;
  F.FindHandle := FindFirstFile(PChar(Path), F.FindData);
  if F.FindHandle <> INVALID_HANDLE_VALUE then
  begin
    Result := FindMatchingFile(F);
    if Result <> 0 then FindClose(F);
  end else
    Result := GetLastError;
end;
{$ENDIF}
{$IFDEF LINUX}
begin
  F.ExcludeAttr := not Attr and faSpecial;
  F.PathOnly := ExtractFilePath(Path);
  F.Pattern := ExtractFileName(Path);
  if F.PathOnly = '' then
    F.PathOnly := IncludeTrailingPathDelimiter(GetCurrentDir);

  F.FindHandle := opendir(PChar(F.PathOnly));
  if F.FindHandle <> nil then
  begin
    Result := FindMatchingFile(F);
    if Result <> 0 then
      FindClose(F);
  end
  else
    Result:= GetLastError;
end;
{$ENDIF}

 

从这里我们可以看到,在windows系统中,默认的过滤范围是

faSpecial = faHidden or faSysFile or faVolumeID or faDirectory;

即查找结果中默认不会显示 隐藏文件,系统文件,卷文件和目录文件,如果想在结果中包含这些属性的文件,就需要在Attr中给予明确的指明。

 

比如,要想查出路径下所有的目录,就需要让Attr至少包含faDirectory的值(Attr参数为整型,各个属性值之间按位与的关系),当然,这样查出来的结果中,也可能会包含一些其他的非目录文件,即只要文件不是 隐藏,系统和卷文件,结果中就会显示。另一方面,如果一个文件虽然是目录文件,但该目录是隐藏的,那么结果中也是不会显示的。

总之,如果不是有特别的要求,尽量还是使用faAnyFile参数,将文件查询出来以后再通过TSearchRec的Attr参数做进一步的处理。

#2


查找文件,不会可以看帮助或google

#3


哥晕了,偌大的一个中国青年软件论坛论坛(我看就是一个绣花枕头),一个小问题扔上面好几天没动静,难道是分数少了么,伤心。。。。。。
要么就是在百度上复制粘贴,要么说了就等于没说。。。一楼的答案我已经在百度上复制过的,一字不差,他妈的长篇大论谁不会啊,帮助别人有点真心好不。。。。

#4


procedure TForm1.Button1Click(Sender: TObject);
var
   TFileInfo:TSearchRec;
   hFile:HWND;
   b:Boolean;
begin
   hFile:=FindFirst('G:\\*.exe',faAnyFile,TFileInfo);
   if hFile=0 then Memo1.Lines.Add('没打开');
   Memo1.Lines.Add(TFileInfo.Name);
   while hFile=0 do begin

     hFile:=findnext(TFileInfo);
     Memo1.Lines.Add(TFileInfo.Name);
   end;
end;