确定,
我使用此函数在我的程序中获取文件大小,即使对于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)来加速操作。
答案 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;
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)。
第一种选择在各方面对我都很好。