[英]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.