TFileStream.Seek 怎么写才能支持INT64位呀(100)

  • 主题发起人 主题发起人 aKnightChen
  • 开始时间 开始时间
A

aKnightChen

Unregistered / Unconfirmed
GUEST, unregistred user!
我是这样写a:TFileStream.....a.Seek(StrToInt64(xxxx),....但这样写,大约到4G左右,就出错了.估计他是调用Seek(LongInt这个函数了.怎么写才能调用到Seek(Int64哪位大哥指定一下.小弟在此先谢谢
 
你传进去的是INT64就自动用。你可以用 .Position 看看。还有你的是NTFS分区吗?
 
楼主用的是Delphi5吧?从Delphi6开始TFileStream.Seek/Size/Position开始支持int64了。
 
我是用D7测试代码如下:4.35G的文件AFileStream.Seek(300,soFromBeginning);showmessage(inttostr(aFileStream.Position)); -->提示:300 (正确)AFileStream.Seek(300*100000,soFromBeginning);showmessage(inttostr(aFileStream.Position)); -->提示:300*100000(正确)AFileStream.Seek(StrToInt64('4294934528'),soFromBeginning); showmessage(inttostr(aFileStream.Position)); -->还是显示:300*100000其中'4294934528'大约是4G左右的数量以上代码顺序执行.就是4G左右,无法Seek成功
 
同意 白河愁 的,在windows下,如果分区格式不是NTFS,而是其他格式的话,文件处理最多是4G,只有NTFS格式的分区,才可以创建和处理超过4G的文件。
 
2^32=4294967296看来,执行时,还是被认为是LongInt来处理,并没有被认为是Int64
 
应当是被看成是LONGWORD我刚看了,确认三个盘全是NTFS格式.(我的电脑-->磁盘(C,D,E)-->右键-->属性-->文件系统:NTFS)(绝对确认,从2003年后,我都一直用NTFS装系统)
 
自已顶一下
 
再顶d一下,希望有人关注d
 
aFileStream.Seek( int64(StrToInt64('1295934999')), soFromCurrent ); aMessage(2,kFileSize(aFileStream.Position)); aFileStream.Seek( int64(StrToInt64('1295934999')), soFromCurrent ); aMessage(2,kFileSize(aFileStream.Position)); aFileStream.Seek( int64(StrToInt64('1295934999')), soFromCurrent ); aMessage(2,kFileSize(aFileStream.Position)); aFileStream.Seek( int64(StrToInt64('1295934999')), soFromCurrent ); aMessage(2,kFileSize(aFileStream.Position));好像用soFromCurrent ,一次走1.2G,就可以走下去.
 
procedure myFileFirstSeek64(aFileStream:TFileStream;iPosition:Int64);const I_1_G_FILE_SIZE=1024*1024*1024;var iLeftSize,iCurSize:Int64;begin if iPosition<=I_1_G_FILE_SIZE then aFileStream.Seek(iPosition,soFromBeginning) else begin aFileStream.Seek(I_1_G_FILE_SIZE,soFromBeginning); iLeftSize:=iPosition-I_1_G_FILE_SIZE; while iLeftSize>0 do begin if iLeftSize>I_1_G_FILE_SIZE then iCurSize:=I_1_G_FILE_SIZE else iCurSize:=iLeftSize; aFileStream.Seek(iCurSize,soFromCurrent); iLeftSize:=iLeftSize-iCurSize; end; end;end;写了个这个函数(从Position=0开始计数),但未经程序检验.(我自已暂时放弃4G以上的大文件了)
 
function fFileSeek64(aFileStream:TStream;iPosition:Int64):Int64;const I_1_G_FILE_SIZE=1024*1024*1024;var iDirect:Integer; iLeftSize,iCurSize:Int64;begin iLeftSize:=iPosition-aFileStream.Position; while iLeftSize<>0 do begin if iLeftSize>0 then iDirect:=1 else iDirect:=-1; if Abs(iLeftSize)>I_1_G_FILE_SIZE then iCurSize:=iDirect*I_1_G_FILE_SIZE else iCurSize:=iLeftSize; aFileStream.Seek(iCurSize,soFromCurrent); iLeftSize:=iLeftSize-iCurSize; end; Result:=aFileStream.Position;end;以上代码是正确的,并且高效,但是,我又发现INDY中不支持,唉.还是暂时只支持到4G吧.
 
多人接受答案了。
 
后退
顶部