首页 > 解决方案 > 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))

标签: delphiwinapi

解决方案


带有变体记录的代码是正确的。

但是这段代码

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]);

请注意,在c32 位值的表达式中,左移 32 位并丢失设置位,然后零转换为 64 位。


推荐阅读