在2000下把一个4.36G认成370MB,把一个3.87G的文件认成负的一百多MB,请问是怎么回事儿?(100分)

  • 主题发起人 主题发起人 biyesheng
  • 开始时间 开始时间
B

biyesheng

Unregistered / Unconfirmed
GUEST, unregistred user!
在2000下把一个4.36G认成370MB,把一个3.87G的文件认成负的一百多MB,请问是怎么回事儿?
有办法解决吗?

比如说我用BlockRead(FromF, Buf,102400, NumRead);
刚读到370来兆Eof(FromF)就返回TRUE了

再比如我用
if FindFirst(OpenDialog1.FileName, faAnyFile, sr) = 0 then
begin
ProgressBar1.Max:=sr.Size div 10240;
ProgressBar1.Position:=1;
end;

结果sr.size显示只有370来兆
 
没人见过这种情况?
 
文件分配表出错了。扫描磁盘
 
你那硬盘坏掉了,建议重新买块硬盘!
OK?!
 
肯定不是硬盘的问题,我在多台机子上跑过了,都会这样。我怀疑是WINDOWS或DELPHI的寻址的问题,如果 它们只用4字节寻址,且最高位表示正负,则只能正确表示2G的文件,超过2G则成负的,超过4G则是文件大小减4G,不知DELPHI是不是这样做的,请大家指教
 
使用WindowsAPI or TFileStream 支持超4G
 
使用GetFileSize函数,简单而确定。
 
无符号整数 你当成有符号整数就成了负数
 
我也听说有2G限制,是真的吗?
 
你可以这样试一下
var
lSize:Longword;
begin
if FindFirst(OpenDialog1.FileName, faAnyFile, sr) = 0 then
begin
lSize:=Longword(sr.Size);//转换
ProgressBar1.Max:=lSize div 10240

ProgressBar1.Position:=1;
end;
....
end;
 
to ilovemilk:
用你的方法把4.36G的文件认为369MB
把3.87G的文件认为3.97G
好象还是有点问题

to zjan521:
能否提供WindowsAPI的函数名
 
对于以 G 计算的软件,可以用内存映射的方式来做。速度快,支持 64 位寻址。
要分段映射视图,用以下几个函数组合:
CreateFile
CreateFileMapping
MapViewOfFile
 
FindFirst取的是文件大小的低位,不能超过2G,看看delphi源代码就知道了。使用FindFirstFile即可取文件大小。
使用FileRead或流 代替 BlockRead


 
to xuhao1:
请问FindFirstFile函数该怎么用啊,我懂得太少,不好意思

另外,是不是也能用FileWrite代替 blockwrite?
但是用什么能代替seek呢?

 
用PQ自动修复一下错误就OK
 
另外我用

Filewrite(iFileHandle,Buf,length(Buf));或
Filewrite(iFileHandle,Buf,SizeOf(Buf));

总是写不进去,返回-1

Buf是用FileRead(iFileHandle, Buf,2048);读出来的,并且读出来的数据没错
 
修改文件头,让操作系统误认,如可以把1.2MB的文件改成120GB那么大。好多通用软件的光盘文件就是采用此方法加密,让你永远复制不了他的文件,自已用的时候再改回来.
 
精通Delphi是我的梦想,本QQ群只用于技术交流,互通有无,有求必应,与同道者同勉!
Delphi群---2986125
 
fat32下,单一文件不能超过2G
 
to wjp888
改原文件最好不要
to clkyui
能超过啊,就是有些函数用起来有问题

to 大家
我现在能正确的在超过2G的文件中定位了,但是我用
FileRead(iFileHandle, Buf,2048);
读出来的数据后改一下(比如buf=0)再写回去时



Filewrite(iFileHandle,Buf,length(Buf));或
Filewrite(iFileHandle,Buf,SizeOf(Buf));

总是写不进去,返回-1,是哪出的问题呢?
 
后退
顶部