如何得到大于2G文件的大小(50分)

  • 主题发起人 主题发起人 xgwzw
  • 开始时间 开始时间
findfirst应该可以吧
 
不行啊 返回值是integer的范围
Integer -2147483648..2147483647 signed 32-bit
不能超过2G
 
取文件属性不行嘛?
 
getfilesize 可以取得文件尺寸的最大值是2的64次方,好像远远大于2G
 
Longword 0..4294967295 unsigned 32-bit

getfilesize 只能得到最大4G

2^30B=1G
2^32B=4G
 
getfilesize的返回值是低位DWord 参数 lpFileSizeHigh是高位DWord,两个DWord组合起来就是2^64B,你看看帮助就知道了
 
getfilesize的返回值是低位DWord 参数 lpFileSizeHigh是高位DWord,两个DWord组合起来就是2^64B,你看看帮助就知道了

正解
 
有没有内存映射的历程?
 
试试
function xGetFileSize(filename: string): double;
var
f: TFileStream;
hw, lw: longword;
i: int64;
begin
F:= TFileStream.Create(filename, fmOpenRead);
try
lw:= GetFileSize(f.Handle, @hw);
i:= hw;
i:= hw shl 32;
i:= hw or lw;
result:= i;
finally
f.Free;
end;
end;
 
to Writer
正在使用的文件不能检测到大小
 
我试过可以哦。 是不是你的文件第一次创建,你就要得到大小……
 
不是 ,是一个数据库日志文件 *.ldf(ms sql 2000)
 
getfilesize的返回值是低位DWord 参数 lpFileSizeHigh是高位DWord,两个DWord组合起来就是2^64B,你看看帮助就知道了

正解
 
to zqw0117
不行啊,在使用的文件测试不行啊
 
procedure Test(fileName ; string)
var
memory : TMemoryStream;
begin
memory := TMemoryStream.Create;
memory.LoadFromFile(fileName);
ShowMessage(IntToStr(memory.Size));
memory.Free;
end;
 
to Beyondbill,
你将整个文件加载到内存?
 
//lpFn: 文件名;
//能获得包括大于 4G 的文件大小
function GetFileBytes(lpFn: PChar): Int64;
var
hFile, dwSizeLow, dwSizeHigh: Longword;
begin
Result := -1;
hFile := CreateFile(lpFn, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, 0);
try
if hFile <> INVALID_HANDLE_VALUE then
begin
dwSizeLow := GetFileSize(hFile, @dwSizeHigh);
Result := dwSizeHigh*4294967296 + dwSizeLow;
end;
finally
CloseHandle(hFile);
end;
end;
 
楼主还不结贴,我试了一个4.5G的文件可以得到准确的字节数。
 
to weiliu
你试过*.ldf mssql数据库日志文件大小没有
数据库正在使用
请大侠再测试 如若成功愿意再出100分,
还有我好像测试时,2次的结果不一样啊(这个文件是固定的影像文件)
 
后退
顶部