2014-09-24 119 views
0

我有一个只给出当前目录的文件夹的过程。如何获取子目录中的所有文件夹(当前目录中的所有文件夹+子目录中存在的所有文件夹)在此先感谢获取指定目录内的文件夹的计数(包括子目录)

procedure GetSubDirectories(const directory : string; list : TStrings) ; 
var 
sr : TSearchRec; 
begin 
try  
    if FindFirst(IncludeTrailingPathDelimiter(directory) + '*.*', faDirectory, sr) < 0 then 
    Exit 
    else 
    repeat 
    if ((sr.Attr and faDirectory <> 0) AND (sr.Name <> '.') AND (sr.Name <> '..')) then 
    List.Add(IncludeTrailingPathDelimiter(directory) + sr.Name) ; 
    until 
    FindNext(sr) <> 0; 
    finally 
    SysUtils.FindClose(sr) ; 
    end; 
end; 
+1

[如何减少扫描文件夹/子文件夹/文件时的CPU使用率?](http://stackoverflow.com/questions/25301936/how-to-reduce-cpu-usage-when-scanning -for-folders-sub-folders-files) – bummi 2014-09-26 07:17:39

回答

1

使用递归:

program Project9; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

function ListFolders(const DirName: string): Integer; 
var 
    Path: string; 
    F: TSearchRec; 
    SubDirName: string; 

begin 
    Path:= DirName + '\*.*'; 
    Result:= 0; 
    if FindFirst(Path, faAnyFile, F) = 0 then begin 
    try 
     repeat 
     if (F.Attr and faDirectory <> 0) then begin 
      if (F.Name <> '.') and (F.Name <> '..') then begin 
      SubDirName:= IncludeTrailingPathDelimiter(DirName) + F.Name; 
      Writeln(SubDirName); 
      Result:= Result + 1 + ListFolders(SubDirName); 
      end; 
     end; 
     until FindNext(F) <> 0; 
    finally 
     FindClose(F); 
    end; 
    end; 
end; 

begin 
    Writeln(ListFolders('C:\Temp')); 
    Readln; 
end. 
+0

谢谢你的帮助。它工作正常。我可以在一个功能中计数吗?像传递一个更多的参数作为subdir作为布尔值? – james 2014-09-24 15:14:05

+1

当然可以;为什么不自己去休息一下? – kludg 2014-09-24 15:18:33

+0

你可以给我提示条件放在哪里吗? – james 2014-09-24 15:21:58

0

功能getCount将(导演:字符串):整数; { user these in your use list System.Ioutils } 开始 结果:=长度(TDirectory.GetFiles(dir,'',TsearchOption.soAllDirectories)) end;

+2

向答案中添加其他详细信息。 – 2017-02-14 04:27:45

相关问题