计算给定路径的子目录数

时间:2011-12-13 16:11:51

标签: delphi search filesystems

我需要在文件系统中进行一些搜索,并希望提供进度指示 粗略的近似值是遍历的目录数。

function GetSubDirCount(Path : String): integer;
var
  Index : Integer;
  Temp : String;
  SearchRec : TSearchRec;
begin
  Result:= 0;
  Temp:= Path;

  if Path[Length(Path)] <> SysUtils.PathDelim then begin
    Path:= Path + SysUtils.PathDelim;
  end;
  Path:= Path + '*.';

  Index:= FindFirst(Path, faDirectory, SearchRec);

  while Index = 0 do begin
    if (SearchRec.Name = '.') or (SearchRec.Name = '..') then begin
      Index:= FindNext(SearchRec);
      Continue;
    end;

    Inc(Result);
    Result:= Result + GetSubDirCount(Temp + SysUtils.PathDelim + SearchRec.Name);
    Index:= FindNext(SearchRec);
  end;

  FindClose(SearchRec);
end;

我目前使用上面的代码,是否有更快的方法?
我只对伯爵感兴趣 如果有一个非常快速的方法来获得文件的数量,这将是一个奖金。

3 个答案:

答案 0 :(得分:4)

由于您没有指定您正在使用的Delphi版本,我建议使用IOUtils中的相应方法 - 即TDirectory.GetDirectoriesTDirectory.GetFiles,因为它们在最近的Delphi版本中可用。

更新:这可能不是计算目录和文件数量的最快方法,但是如果文件以后再进行迭代,也可以使用这些函数的结果迭代。

答案 1 :(得分:0)

小改进:在参数声明中使用const。 例如:

function GetSubDirCount(const Path : String): integer;

正如Rob所指出的那样,这不会起作用,因为Path在体内被修改了。我仍然会使用这种方法,而不是修改体内的路径。我有一个本地字符串var“Suffix”,修改它(添加可选的pathdelim和'*。'),并将它们传递给FindFirst:

FindFirst(Path+Suffix, faDirectory, SearchRec);

答案 2 :(得分:0)

@Johan 由于Windows代码占用的时间最多,我建议您应用其他受访者建议的修复程序,如果您对此感到满意,请更新代码以使用线程:

  • 一旦检索到子目录,就将其添加到(线程安全)列表中

  • 让一个线程查看该列表,并将每个目录的工作线程产生到实际的文件处理

  • 始终更新您的进度:找到/处理的目录数量。这在开始时会有点不稳定,但至少你可以在Windows仍然“找到”时开始工作

“常规”警告适用:

  • 不要让你的线程数太大

  • 如果您的文件处理创建新文件,请确保您的查找例程不会阻塞新的输出文件