使用Delphi 7开发我们的主要应用程序。我们正在导入数据文件。文件大小以字节为单位超过了vcl和我的代码用来保存它的整数变量的大小...所以它变为负数并且采取空文件操作......
我们当前检查文件大小的代码(从而决定是否为空)是:
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在更大整数中的任何其他替换函数吗?
答案 0 :(得分: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;
答案 1 :(得分:2)
尝试使用FindData.nFileSizeHigh
和FindData.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;