如何从文件中读取一个大的缓冲区(200分)

  • 主题发起人 主题发起人 whoamiwhoami
  • 开始时间 开始时间
W

whoamiwhoami

Unregistered / Unconfirmed
GUEST, unregistred user!
最近我在Delphi 4.0中调用API文件操作函数时,出现一个问题,希望<br>各路高手能在百忙之中给予指导。<br><br>下面是一段错误代码,该代码是在DELPHI 4.0下进行调试的,当我从文件中读取<br>一个大的缓冲区时,就会出现错误。当然,如果您能利用DELPHI自身的文件操作函数可以<br>避免这个问题,也可以告诉我。<br><br>该代码执行到GlobalUnlock一句时出错,奇怪的是,当我将<br>readfile(t_file,t_bits,t_num,t_len,0)一句注释掉时,错误就没有了。<br>我不知道是内存操作函数的错误,还是文件读取函数的错误,请高手指点。<br>如获得解答,必有好东东相赠。<br>procedure TForm1.SpeedButton4Click(Sender: TObject);<br>var<br>&nbsp; &nbsp;t_file:THandle;<br>&nbsp; &nbsp;t_num:integer;<br>&nbsp; &nbsp;t_len:dword;<br>&nbsp; &nbsp;t_handle:THandle;<br>&nbsp; &nbsp;t_bits:pchar;<br>begin<br>&nbsp; &nbsp; &nbsp;t_num:=300000;<br>&nbsp; &nbsp; &nbsp;t_file:=createfile('bitmap1.gr2',GENERIC_READ,FILE_SHARE_READ,<br>&nbsp; &nbsp; &nbsp;0,<br>&nbsp; &nbsp; &nbsp;OPEN_EXISTING,<br>&nbsp; &nbsp; &nbsp;FILE_ATTRIBUTE_ARCHIVE,<br>&nbsp; &nbsp; &nbsp;0);<br>&nbsp; &nbsp; &nbsp;t_len:=0;<br>&nbsp; &nbsp; &nbsp;t_handle:=GlobalAlloc(GMEM_MOVEABLE OR GMEM_ZEROINIT,t_num);<br>&nbsp; &nbsp; &nbsp;t_bits:=GlobalLock(t_handle);<br>&nbsp; &nbsp; &nbsp;readfile(t_file,t_bits,t_num,t_len,0);<br>&nbsp; &nbsp; GlobalUnlock(t_handle);<br>&nbsp; &nbsp; closehandle(t_file);<br>end;<br>我的Email:haoligan@263.net
 
把分给我吧<br>很简单,在t_bits后面加一个^<br>
 
好像readfile读取的数据块不能大于64K,你可以分成几小块读.
 
API我不是很清楚,我一直用BlockRead<br>它的最高限制是2147483647个记录。
 
不用那么复杂吧<br>procedure TForm1.BitBtn1Click(Sender: TObject);<br>const<br>&nbsp; &nbsp; &nbsp;len = 1024 *1024;<br>&nbsp; &nbsp; &nbsp;startpos = 1234;<br>var<br>&nbsp; &nbsp;F:file;<br>&nbsp; &nbsp;st:string;//最好是全局的<br>begin<br>&nbsp; &nbsp; &nbsp;assignfile(f,'f:/1111.txt');<br>&nbsp; &nbsp; &nbsp;reset(f,1);<br>&nbsp; &nbsp; &nbsp;setlength(st,len);<br>&nbsp; &nbsp; &nbsp;seek(f,startpos);<br>&nbsp; &nbsp; &nbsp;blockread(f,st[1],len);<br>&nbsp; &nbsp; &nbsp;closefile(f);<br>end;<br>
 
既然已经用了 Win APIs &nbsp; createfile(), 干脆建立FileMapping,映射一下<br>BTW:<br>1.createfile()<br>2.CreateFileMapping()<br>3.MapViewOfFile() &nbsp;//这个API可以将文件映射到内存,操作文件就像内存操作,很爽的!<br>
 
我用FileRead可以读出10M的数据!
 
何必这么麻烦用API呢?<br>var<br>&nbsp; F: TFileStream;<br>&nbsp; P: Pointer;<br>begin<br>&nbsp; F := TFileStream.Create('bitmap1.gr2', fmOpenRead);<br>&nbsp; GetMem(P, t_num);<br>&nbsp; F.Read(P^, t_num);<br>&nbsp; ...<br>&nbsp; FreeMem(P, t_num);<br>&nbsp; F.Free;<br>end;<br><br>既然你用API的话:<br>&nbsp; t_num:=300000;<br>&nbsp; t_file:=CreateFile(...);<br>&nbsp; GetMem(P, t_num);<br>&nbsp; FileRead(t_file, P^, t_num); // FileRead是Delphi的函数<br>&nbsp; ...<br>&nbsp; FreeMem(P, t_num);<br>&nbsp; CloseHandle(t_file);<br>
 
提出问题的当天人家就给帮你找到原因了,为什么还不结束,难道是想等我来瓜分?
 
我现在也常常用流式文件操作(TFileStream)<br>但是我没感觉到他与普通文件操作的优越性。<br>哪位大虾说一下?我谢谢了。
 
寻人启事:whoamiwhoami你在哪里?
 
是使用Delphi本身的TFileStream不就行啦,这就是把文件读入缓冲区,和内存一样访问,非常方便而且稳定
 
多人接受答案了。
 
后退
顶部