如何解决Delphi> 10GB时FileSize最快
希望与您的专家确认此功能是否存在任何缺陷。它可以在各种Windows操作系统上正常工作吗?我正在使用Delphi Seattle(32和64位exe)。我使用它而不是Findfirst来提高速度。
function GetFileDetailsFromAttr(pFileName:WideString):int64;
var
wfad: TWin32FileAttributeData;
wSize:LARGE_INTEGER ;
begin
Result:=0 ;
if not GetFileAttributesEx(pwidechar(pFileName),GetFileExInfoStandard,@wfad) then
exit;
wSize.HighPart:=wfad.nFileSizeHigh ;
wSize.LowPart:=wfad.nFileSizeLow ;
result:=wsize.QuadPart ;
end;
此命令显示的典型googled示例不适用于文件大小> 9GB
function GetFileAttributesEx():Int64 using
begin
...
result:=((&wfad.nFileSizeHigh) or (&wfad.nFileSizeLow))
解决方法
带有变体记录的代码是正确的。
但是此代码
result:=((&wfad.nFileSizeHigh) or (&wfad.nFileSizeLow))
只是错误,结果无法克服32位边界
评论链接中的代码
result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32);
是错误的,因为它没有说明编译器如何使用32位和64位值。查看下一个示例,该示例显示如何正确处理此情况(对于值d,e):
var
a,b: DWord;
c,d,e: Int64;
wSize:LARGE_INTEGER ;
begin
a := 1;
b := 1;
c := Int64(a) or Int64(b shl 32);
d := Int64(a) or Int64(b) shl 32;
wSize.LowPart := a;
wSize.HighPart := b;
e := wsize.QuadPart;
Caption := Format('$%x $%x $%x',[c,e]);
请注意,在c
的表达式中,将32位值向左移32位,然后松开设置位,然后将零转换为64位。
不受文件大小限制的限制:如果您使用已经存在约25年的类型(manual)将文件大小直接分配给函数的结果,而不是使用中间变量:
Int64Rec(result).Hi:= wfad.nFileSizeHigh;
Int64Rec(result).Lo:= wfad.nFileSizeLow;
end;
如果这对任何人都不明显,则编译如下:
上面:中间变量w: LARGE_INTEGER
首先被分配了两个32位部分,然后自身被分配给函数的结果。费用:10条指令。
上面:记录Int64Rec
用于强制转换函数的结果并直接分配两个32位部分,而无需任何其他变量。费用:6条指令。
使用的环境:Delphi 7.0(内部版本8.1),编译器版本15.0,Win32可执行文件,代码优化:开。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。