Procedure Copyfilethread.CopyFilewithstream();
Var SouFile,DescFile:TFileStream;
Buf:Array [1..4096] of Char;
begin
If Assigned(FrmCopyFile)Then Sendmessage(FrmCopyFile.Handle,WM_CopyMsg,0,0);
SouFile:=TfileStream.Create(SourceFile,fmOpenRead or fmShareDenyWrite);
DescFile:=TFileStream.Create(TargetFile,fmCreate);
SouFile.Position:=0;
try
While SouFile.Position<=SouFile.Size do
begin
If (SouFile.Size-SouFile.Position)>4096 Then
Begin
SouFile.ReadBuffer(Buf,sizeof(buf));
DescFile.WriteBuffer(Buf,sizeof(buf));
End Else
Begin
SouFile.ReadBuffer(Buf,SouFile.Size-SouFile.Position);
DescFile.WriteBuffer(Buf,SouFile.Size-SouFile.Position);
Break;
End;
If Assigned(FCopyTaskList.ProcessGauge) Then FCopyTaskList.ProcessGauge.Value:=trunc((SouFile.Position/SouFile.Size)*100);
End;
finally
If Assigned(FrmCopyFile)Then Sendmessage(FrmCopyFile.Handle,WM_CopyMsg,0,0);
SouFile.Free();
DescFile.Free();
end;
End;
Var SouFile,DescFile:TFileStream;
Buf:Array [1..4096] of Char;
begin
If Assigned(FrmCopyFile)Then Sendmessage(FrmCopyFile.Handle,WM_CopyMsg,0,0);
SouFile:=TfileStream.Create(SourceFile,fmOpenRead or fmShareDenyWrite);
DescFile:=TFileStream.Create(TargetFile,fmCreate);
SouFile.Position:=0;
try
While SouFile.Position<=SouFile.Size do
begin
If (SouFile.Size-SouFile.Position)>4096 Then
Begin
SouFile.ReadBuffer(Buf,sizeof(buf));
DescFile.WriteBuffer(Buf,sizeof(buf));
End Else
Begin
SouFile.ReadBuffer(Buf,SouFile.Size-SouFile.Position);
DescFile.WriteBuffer(Buf,SouFile.Size-SouFile.Position);
Break;
End;
If Assigned(FCopyTaskList.ProcessGauge) Then FCopyTaskList.ProcessGauge.Value:=trunc((SouFile.Position/SouFile.Size)*100);
End;
finally
If Assigned(FrmCopyFile)Then Sendmessage(FrmCopyFile.Handle,WM_CopyMsg,0,0);
SouFile.Free();
DescFile.Free();
end;
End;
var
len:integer; Begin
len:=SouFile.Read(Buf,SouFile.Size-SouFile.Position);
DescFile.Write(Buf,len);
Break;
End;
好像Readbuffer没有read到你指定的长度就会出错而放弃.一般我习惯用read/write,感觉安全点
SouFile.ReadBuffer(Buf,SouFile.Size-SouFile.Position);
DescFile.WriteBuffer(Buf,SouFile.Size-SouFile.Position); //XXXXXXXXXXXXXXXXXXXXXX
执行了SouFile.ReadBuffer后,SouFile.Position改变了,后面SouFile.Size-SouFile.Position=0,所以没把buf写如DescFile。
用个中间变量来传递一下就可以了。
iLen:=SouFile.Size-SouFile.Position;
SouFile.ReadBuffer(Buf,iLen);
DescFile.WriteBuffer(Buf,iLen);