我需要在文件系统中进行一些搜索,并希望提供进度指示 粗略的近似值是遍历的目录数。
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;
我目前使用上面的代码,是否有更快的方法?
我只对伯爵感兴趣
如果有一个非常快速的方法来获得文件的数量,这将是一个奖金。
答案 0 :(得分:4)
由于您没有指定您正在使用的Delphi版本,我建议使用IOUtils中的相应方法 - 即TDirectory.GetDirectories和TDirectory.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仍然“找到”时开始工作
“常规”警告适用:
不要让你的线程数太大
如果您的文件处理创建新文件,请确保您的查找例程不会阻塞新的输出文件