关于BlockRead和BlockWrite的使用,为什么需要循环呢?(30分)

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

Archerfl

Unregistered / Unconfirmed
GUEST, unregistred user!
如下是一段文件拷贝代码:
procedure FileCopy(const FromFile, ToFile: string);
var
  FromF, ToF: file;
  NumRead, NumWritten: Word;
  Buf: array[1..2048] of Char;
begin
  AssignFile(FromF, FromFile);
  Reset(FromF, 1);
  AssignFile(ToF, ToFile);
  Rewrite(ToF, 1);
  repeat
    BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
    BlockWrite(ToF, Buf, NumRead, NumWritten);
  until (NumRead = 0) or (NumWritten <> NumRead);
  CloseFile(FromF);
  CloseFile(ToF);
end;
其中,BlockRead和BlockWrite外面为什么还要套上循环测试呢?按照上面的代码意思,直接
调用这两句不就已经实现拷贝了吗?另外,就算是需要循环,那么or两边这两个判断条件各是
判断什么情况的呢?
请各位高手指正!谢!
 
一个大文件分很多次读写,直到读完或者读到最后一块

-----
http://www.8421.org
 
  我看了一下BlockRead和BlockWrite的帮助,它们的基本意思是指按照我们预先设定的Count
值去读取或写入文件中,只不过可能实际写入的文件块数目有可能小于或正好等于Count。这难道
还需要多次读写吗?
 
上面的代码明显是一次读2048字节,一个文件不会正好2048字节
 
噢,不是,上面这段代码的意思是一次读取一个字节,至多读2048个字节!
我设的这个数组可以为任意,只要它足够大!
 
是做为流模式来操作的吧,是有大小限制的,太大不可以,小了可以,不知道文件的大小,
当然得分开了
 
分开读和写是为了系统稳定性考虑, 一般是先把文件读到内存中来,再写到他应该写到的
位置,如果没有限制,系统内存就不够,严重影响性能。所以要分次读和写
 
请问or 语句后面那句 NumWritten <> NumRead ,在何种情况下会成立呢?我想不出来,请
提示!
 
问题提的很莫名其妙,人家明明写的是:
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
每次试图读取Sizeof(Buf)个字节,也就是2048个字节,偏偏有人说每次读取一个字节。

NumWritten <> NumRead 看上去应该很难成立,不过可能也有特殊情况,比如磁盘空间
不够了,只写了一半的数据,则NumWritten < NumRead

至于为什么要循环,我想这只是一个help里面带的例子,没必要这么深究吧。就我的理解,
如果一次性把源文件字节全部读出来,内存不一定够用,至少这样写可靠性好一些把
 
多人接受答案了。
 
后退
顶部