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;

解决方案 »

  1.   


    var
       len:integer;    Begin 
         len:=SouFile.Read(Buf,SouFile.Size-SouFile.Position); 
         DescFile.Write(Buf,len); 
         Break; 
        End;
    好像Readbuffer没有read到你指定的长度就会出错而放弃.一般我习惯用read/write,感觉安全点
      

  2.   

    粗略看下,问题应该出在这里
         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);
      

  3.   

    感谢 gzmhero ,skylkj (不好意思,没有仔细看答案,没有给到你分)应该问题出现在这里,另外使用BlockRead的话,如果文件路径是在网络的,则报错,我也不知道原因在哪里。。!