FileSize函数的速度问题

时间:2014-08-04 07:58:40

标签: delphi

确定,

我使用此函数在我的程序中获取文件大小,即使对于4GB以上的文件也能很好地工作。

function FileSize(const PathtoFile: string): Int64;
var
  AttributeData: TWin32FileAttributeData;
begin
  if GetFileAttributesEx(PChar(PathtoFile), GetFileExInfoStandard,
    @AttributeData) then
  begin
    Int64Rec(Result).Lo := AttributeData.nFileSizeLow;
    Int64Rec(Result).Hi := AttributeData.nFileSizeHigh;
  end
  else
    Result := -1;
end;

现在,问题在于,当使用AQTime标准分析我的应用时,我发现当我获取大约35 Secs的文件大小时,我的程序在此函数中花费4758 Files与{my} { {1}}处理相同数量的文件时。 请问我可以使用任何代码代替我当前的代码(即使它是ASM)来加速操作。

3 个答案:

答案 0 :(得分:0)

GetFileAttributesEx和GetFileAttributes都是windows api调用。那里的收益真的不大。

您可以考虑的一件事就是直接阅读MFT,如果您将其付诸实践将会非常快。虽然这不是一个简单的5线解决方案。

有关详细信息,请参阅此答案:https://stackoverflow.com/a/3061745/1107597

答案 1 :(得分:0)

您可以尝试使用FindFist获取文件大小,然后读取此函数返回的TSearchRec中的大小字段。

答案 2 :(得分:-1)

你可以试试这个:

function getFileSize( vFileName : String ) : Int64;
var F : TFileStream;
begin
  Result := 0; // or -1

  try

    if FileExists( vFileName ) then
    try
      F := TFileStream.Create( vFileName );
      Result := F.Size;
    finally
      F.Free;
    end;

  except end;

end;

或类似KobikDavid说:

function getFileSizeInteger( vFileName : String ) : Integer;
var SR : TSearchRec;
begin
  Result := 0; // or -1

  if FindFirst( vFileName, faArchive, SR ) then
  try
    Result := SR.Size;
  finally
    FindClose( SR );
  end;

end;

第二个选项(使用FindFirst)中的问题是结果仅限于整数边界(4GB)。

第一种选择在各方面对我都很好。