簡體   English   中英

Delphi 對於大小 > 10gb 的文件大小最快

[英]Delphi fastest FileSize for sizes > 10gb

如果此功能有任何缺點,想咨詢您的專家。 它會在各種 Windows 操作系統上正常工作嗎? 我正在使用 Delphi 西雅圖(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 位。

不受您如何獲取文件大小的限制:如果您使用已經存在約 25 年的類型( 手動)將文件大小直接分配給函數的結果而不是使用中間變量,它甚至會更快:

  Int64Rec(result).Hi:= wfad.nFileSizeHigh;
  Int64Rec(result).Lo:= wfad.nFileSizeLow;
end;

如果這對任何人來說都不明顯,那么編譯如下所示:

帶中間變量

上圖:中間變量w: LARGE_INTEGER首先被分配了兩個 32 位部分,然后將自身分配給函數的結果。 費用:10 條指令。

直接在函數結果上使用記錄

上圖:記錄Int64Rec用於轉換函數的結果並直接分配兩個 32 位部分,不需要任何其他變量。 費用:6 條指令。

使用環境:Delphi 7.0(Build 8.1),編譯器版本15.0,Win32可執行,代碼優化:開啟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM