delphi - Delphi 最快的 FileSize 大小 > 10gb
问题描述
如果此功能有任何缺点,想咨询您的专家。它会在各种 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;
使用此命令显示的典型 google 示例不适用于文件大小 > 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, d, e]);
请注意,在c
32 位值的表达式中,左移 32 位并丢失设置位,然后零转换为 64 位。
推荐阅读
- node.js - TypeError:无法读取未定义的属性“电子邮件”,如何解决
- teamcity - 我的新 Megatester 构建 (1215.7) 项目没有被 EyeOfSauron 选中
- arrays - 返回其视图控制器时刷新自定义表视图
- javascript - 重命名反应钩子属性的好习惯?
- c++ - 为什么“使用命名空间标准;” 在 C++ 中处理双精度时给出不同的结果?
- r - 带有 if 语句的嵌套 for 循环
- typescript - Sonarqube - 删除这个对变量“x”的无用赋值
- python - Django Queryset 模拟对象和计数
- python - 使用 django-filter 使用嵌套序列化程序过滤视图
- r - 如何使用归因模型(马尔可夫链)在每个消费者的购买决策中获得渠道的归因?