有关BlockWrite/BlockRead的问题!(50)

  • 主题发起人 主题发起人 hksoobe
  • 开始时间 开始时间
H

hksoobe

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TFrmMain.TransFile(filename:String); //这是一个分块接收文件函数Const BlockLen=1024*4; //缓冲区大小var Ftrans:File of Byte; //要收的文件 Recelen:Integer; //收到的分块大小 BlockBuf:Array[0..BlockLen-1] of Byte; //缓冲区 ReceSocket:TSocket; ra:SOCKADDR_IN; ra_len:Integer;begin Ra_len:=sizeof(Ra); ReceSocket:=accept(Server,@ra,@ra_len); AssignFile(Ftrans,filename); ReWrite(Ftrans); StopTrans:=False;//停止发送文件 InTrans:=True;//正在发送文件 Recelen:=recv(ReceSocket,BlockBuf,BlockLen,0);//先接收一个文件分块 while (Recelen>0) and (not StopTrans) do //接收分块再循环写入文件 begin BlockWrite(Ftrans,BlockBuf[0],Recelen);//这里我就不明白了,具体如最下面 Application.ProcessMessages; Recelen:=recv(ReceSocket,BlockBuf,BlockLen,0); end; if StopTrans then begin CloseFile(Ftrans); closesocket(ReceSocket); InTrans:=False; MessageBox(Handle,'停止传输!','提示',MB_OK); Exit; end; CloseFile(Ftrans); closesocket(ReceSocket); InTrans:=False; if (Recelen=SOCKET_ERROR) then MessageBox(Handle,'传输异常终止!','提示',MB_OK) else MessageBox(Handle,'客户端已经关闭连接!文件可能已经传送完毕!','提示',MB_OK)end;ps:那里收到一个文件分块再用,再用BlockWrite写入文件中,一个一个分块用While do写入文件中我也知道,但是问题就在这里我就不明白它又没指定文件写入的位置,它怎么知道这个文件上次的分块写到哪个位置了,它会接着下面再写入文件,难道BlockWrite函数会自动记录上次写到哪个文件位置了再接着写下去,还有BlockRead也是我就不贴出发文件函数了,那也一样它难道也知道,从文件中按分块大小一个一个读出指定的分块是从哪个位置开始,上次读到哪个位置,这次再接着读出来?不知道我说的清不清楚,大家有没有明白我的意思,我看到这两个函数都有四个参数,最后一个参数是什么意思啊!难道这个参数就是这个可以自动记录的原因所在吗?
 
晕看这贴的人都几百了,怎么一个人都不来发个话啊!是没明白我的意思还是我的问题太白了,没意思回答啊!来的人说句话啊!顶顶也行啊!
 
只要你没有关闭文件closeFileBlockWrite 及BlockRead 会自动记录文件指针至于第4个参数,是一个返回值,你读取第三个参数为512(1024也行,自己设置) ,如果文件大小刚好,512的倍数,返回512,如果不是倍数的话,就返回一个实际读取的数据大小delphi6帮助的例子var FromF, ToF: file; NumRead, NumWritten: Integer; Buf: array[1..2048] of Char;begin if OpenDialog1.Execute then { Display Open dialog box } begin AssignFile(FromF, OpenDialog1.FileName); Reset(FromF, 1); { Record size = 1 } if SaveDialog1.Execute then { Display Save dialog box} begin AssignFile(ToF, SaveDialog1.FileName); { Open output file } Rewrite(ToF, 1); { Record size = 1 } Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF)) + ' bytes...'); repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); //判断读取返回值 NumRead=0 也就是读不出数据了(文件末尾),或 写入的数据与写入返回的数据不相等(磁盘盘、只读或写入权限不够等其他原因) CloseFile(FromF); CloseFile(ToF); end; end;end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部