以下代码列出文件但不列出目录
var
rec : tsearchrec;
begin
findfirst('c:\test\*',faanyfile-fadirectory,rec);
showmessage(rec.Name);
if findnext(rec) <> 0 then close else
showmessage (rec.Name);
end;
答案 0 :(得分:18)
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。它将会返回你的文件。