Findfirst,findnext列出文件但不是目录......?

时间:2009-09-25 16:49:03

标签: delphi

以下代码列出文件但不列出目录

var 
rec : tsearchrec;
begin
findfirst('c:\test\*',faanyfile-fadirectory,rec);
        showmessage(rec.Name);
if findnext(rec) <> 0 then close else
showmessage (rec.Name);
end;

5 个答案:

答案 0 :(得分:18)

  1. 您不需要排除目录,不幸的是您使用(-faDirectory)
  2. 完成后你必须调用FindClose。
  3. 如果要查找目录中的所有内容,则需要循环
  4. var
     rec : tsearchrec;
    begin
      if FindFirst('c:\*', faAnyFile, rec) = 0 then
      begin
        repeat
          ShowMessage(rec.Name);
        until FindNext(rec) <> 0;
        FindClose(rec);
      end;
    end;
    

答案 1 :(得分:5)

Read the documentation关于过滤器的实际工作方式:

  

Attr参数指定要包含的特殊文件   所有普通文件

换句话说,FindFirst()始终返回普通文件,无论您指定任何过滤条件。 Attr参数仅在基本过滤器中包含其他类型的属性。您需要测试TSearchRec.Attr字段以确定报告的条目实际上是文件还是目录,例如:

if (rec.Attr and faDirectory) <> 0 then
  // item is a directory
else
  // item is a file

如果实现递归搜索循环,请确保忽略“。”和“..”目录或者你的循环将无限地递归:

procedure ScanFolder(const Path: String);
var  
  sPath: string;
  rec : TSearchRec; 
begin 
  sPath := IncludeTrailingPathDelimiter(Path);
  if FindFirst(sPath + '*.*', faAnyFile, rec) = 0 then 
  begin
    repeat
      // TSearchRec.Attr contain basic attributes (directory, hidden,
      // system, etc). TSearchRec only supports a subset of all possible
      // info. TSearchRec.FindData contains everything that the OS
      // reported about the item during the search, if you need to
      // access more detailed information...

      if (rec.Attr and faDirectory) <> 0 then
      begin
        // item is a directory
        if (rec.Name <> '.') and (rec.Name <> '..') then
          ScanFolder(sPath + sr.Name);
      end
      else
      begin
        // item is a file
      end;
    until FindNext(rec) <> 0;
    FindClose(rec);
  end;
end; 

ScanFolder('c:\test');

答案 2 :(得分:4)

您通过在flags参数中声明“ - faDirectory”来明确排除目录。

答案 3 :(得分:2)

findfirst('c:\ test \ *', faanyfile ,rec)怎么样; //不是faanyfile-fadirectory

答案 4 :(得分:-2)

如果你想要所有文件和目录,只需将faDirectory传递给findfirst。它将会返回你的文件。