2011-03-17 36 views
0

使用Delphi 7開發我們的主應用程序。我們正在導入數據文件。以字節爲單位的文件大小超過了vcl和我的代碼用來保存它的整數變量的大小...所以它變爲負數並且空文件動作被採取...更改GetFileSize上的數據類型大小

我們當前的代碼來檢查文件大小決定是否爲空)是:

function getfilesize(vfilename: string): integer; 
var 
    SearchRec: TSearchRec; 
begin 
    try 
    result:= -1; 
    if FindFirst(vfilename, faAnyFile, SearchRec) = 0 then 
     result:= SearchRec.Size; 
    FindClose(SearchRec); 
    except 
     on e: exception do 
     raise exception.create('Error: functions\getfilesize - Unable to analyze file Attributes to determine filesize. '#13#10+e.message); 
    end; 

多年來這已來回改變,但在過去5年這 運作良好。

searchrec.size是一個INTEGER,所以只是改變我們的返回類型 是不夠的。商店中還有很多其他因素,與我們的代碼和我們使用的數據庫字段有關。

問:對於我們來說,還有哪些其他D7確定字節文件大小的方法可以使用 ,它們使用更大的數據類型?

問:你知道任何其他替換函數getFilesize在一個更大的整數?

回答

7

GetFileAttributesEx()是最方便的Windows API調用。這是最快的,不像GetFileSize()不需要你獲得文件句柄。

把它包起來,像這樣:

function FileSize(const FileName: string): Int64; overload; 
var 
    AttributeData: TWin32FileAttributeData; 
begin 
    if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @AttributeData) then 
    RaiseLastOSError; 
    Int64Rec(Result).Lo := AttributeData.nFileSizeLow; 
    Int64Rec(Result).Hi := AttributeData.nFileSizeHigh; 
end; 

如果你碰巧有一個文件句柄然後GetFileSizeEx()可能是最好的:

function GetFileSizeEx(hFile: THandle; var FileSize: Int64): BOOL; stdcall; external kernel32; 

function FileSize(hFile: THandle): Int64; overload; 
begin 
    if not GetFileSizeEx(hFile, Result) then 
    RaiseLastOSError; 
end;  
+0

+1這很好。有時候你有一個文件名,但不是一個句柄,其他時候你有一個句柄而不是文件名。 ;) – 2011-03-17 18:04:50

+0

@Craig當你有一個句柄它很簡單,你可以調用['GetFileSizeEx()'](http://msdn.microsoft.com/en-us/library/aa364957(VS.85).aspx)。 – 2011-03-17 18:06:35

+0

'windows.GetFileAttributesEx'有什麼不好? – 2011-03-17 18:38:56

2

嘗試使用FindData.nFileSizeHighFindData.nFileSizeLow,你可以寫這樣的事情:

function GetFileSizeExt(const FileName : TFileName) : Int64; 
var 
    SearchRec : TSearchRec; 
begin 
    if FindFirst(FileName, faAnyFile, SearchRec) = 0 then 
     result := Int64(SearchRec.FindData.nFileSizeHigh) shl Int64(32) + Int64(SearchRec.FindData.nFileSizeLow) 
    else 
     result := -1; 

    FindClose(SearchRec) ; 
end; 
+0

+1較短的比我(現在我把它一起工作D7),但貴,因爲你必須創建和銷燬SearchRec。幾乎可以肯定,你無關緊要。 – 2011-03-17 17:49:03