sever端:
      WriteLn('OK '+IntToStr(Fs.Size));  //发送文件大小
      OpenWriteBuffer;
      FS.Position:= 0;
      repeat
        Application.ProcessMessages;
        ct := Fs.Read(Fbuffer,4096);
        WriteBuffer(Fbuffer,ct);
      until (ct=0) or (not Connected);
      CloseWriteBuffer;
      FreeAndNil(Fs);
      Disconnect;方法1 :( 为什么出不来进度条呢??)
   client: 
         rt := readln;
         Delete(rt,1,2); 
         repeat
              Application.ProcessMessages;
              ReadStream(Fs,-1,true);
              ct := Fs.Size;
              self.Gauge1.Progress := ct;//下载进度
          until (not connected) or (ct >= StrToInt(rt));方法2:(这回有进度了,为什么总是到99%时报错socked disconnect gracefully)
      client:
         rt := readln;
         Delete(rt,1,2); 
         repeat
              Application.ProcessMessages;
              readbuffer(Fbuffer,sizeof(Fbuffer));
              ct := sizeof(Fbuffer);
              self.Gauge1.Addprog(ct);//下载进度
          until (not connected) or (ct=0) or (Fs.size >= StrToInt(rt));

解决方案 »

  1.   

    try
        AssignFile(FromF, TheFileName);
        FileMode := 0;
        Reset(FromF);
        Seek(FromF, ThePosition);
      except
        try
          CloseFile(FromF);
        except
        end;
        Self.Terminate;
        exit;
      end;
      try
        FileLen := FileSize(FromF);
        SysThread.Connection.WriteInteger(FileLen - ThePosition);
      except
        CloseFile(FromF);
        Self.Terminate;
        exit;
      end;  repeat
        try
          SysThread.Connection.OpenWriteBuffer;
          BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
          SysThread.Connection.WriteBuffer(Buf, NumRead);
          SysThread.Connection.CloseWriteBuffer;
        except
          CloseFile(FromF);
          exit;
        end;
      until (NumRead = 0);
      CloseFile(FromF);
      //SysThread.Connection.Disconnect;
      self.Terminate;
      

  2.   

    try //发送下载的文件
          DownLoadTcp.Write('文件下载' + EOL); //1-------SendfileCMD
          DownLoadTcp.Write(Edit3.Text + Edit1.Text + EOL); //2-------SendfileName
        except
          DownLoadTcp.Disconnect;
          Animate1.Active := False;
          beep;
          Self.Caption := '提示:网络信息发送失败!';
          exit;
        end;
        //TmpFName := Edit2.Text + '\' + Edit1.Text;
        TmpFName := Edit2.Text + Edit1.Text;
        //================================文件接续
        try
          if FileExists(TmpFName) then
          begin
            SaveFStream := TFileStream.Create(TmpFName, fmOpenReadWrite);
            AlreadyReadLen := SaveFStream.Size;
          end
          else
          begin
            SaveFStream := TFileStream.Create(TmpFName, fmCreate);
            AlreadyReadLen := 0;
          end;
        except
          beep;
          beep;
          Self.Caption := '错误提示:请重新指定下载目录!';
          exit;
        end;
        //===============================
        try
          DownLoadTcp.WriteInteger(AlreadyReadLen); //---send filePos文件位置
        except
          SaveFStream.free;
          Animate1.Active := False;
          DownLoadTcp.Disconnect;
          Self.Caption := '错误提示:网络信息发送失败!';
          exit;
        end;
        try
          //iReturn := DownLoadTcp.ReadInteger;
          RetStr := DownloadTcp.ReadLn(EOL);
        except
          SaveFStream.free;
          DownLoadTcp.Disconnect;
          Animate1.Active := False;
          Self.Caption := '错误提示:远程网络断开,接收失败!';
          exit;
        end;
        if RetStr = 'OK' then //------------------------读取接收标志
        begin //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          //读数据------------------------开始-----
          try
            ReadFileLen := DownLoadTcp.ReadInteger;
          except
            SaveFStream.free;
            DownLoadTcp.Disconnect;
            Animate1.Active := False;
            Self.Caption := '错误提示:远程网络断开,接收失败!';
            exit;
          end;
          SaveFStream.Position := SaveFStream.Size;
          ProgressBar1.Max := ReadFileLen + AlreadyReadLen;
          ProgressBar1.Position := 0;
          try
            DownLoadTcp.ReadStream(SaveFStream, ReadFileLen);
          except
            SaveFStream.Free;
            Animate1.Active := False;
            DownLoadTcp.Disconnect;
            Self.Caption := '错误提示:远程网络断开,接收失败!';
            exit;
          end;
          SaveFStream.free; //下载成功
          Bitbtn3.Enabled := True;
          beep;
          Self.Caption := '下载完毕! 共:' + IntToStr(ProgressBar1.Max) + '字节';
          ProgressBar1.Position := ProgressBar1.Max;
          Sleep(100);
          if Self.Tag = 1 then
          //  DelRemoteFile(Edit3.Text + Edit1.Text, Form1.IdFTCPClient);
          DownLoadTcp.Disconnect;
          Animate1.Active := False;
          if checkBox1.Checked then Close;
          exit;
        end; //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        DownLoadTcp.Disconnect; //
        Self.Caption := '反馈提示:远程文件定位失败,连接断开!';
        Animate1.Active := False;
        Bitbtn1.Enabled := True;
        exit;
      end; //============================================================
      beep;
      Self.Caption := '提示:网络连接失败!';
      

  3.   

    to 我在飞,
    谢谢,下面这样接收没法写进度呀!!(看我的题目,只是无法写进度,不是传输。)
    try
            DownLoadTcp.ReadStream(SaveFStream, ReadFileLen);
          except
            SaveFStream.Free;
            Animate1.Active := False;
            DownLoadTcp.Disconnect;
            Self.Caption := '错误提示:远程网络断开,接收失败!';
            exit;
          end;
      

  4.   

    方法1 :( 为什么出不来进度条呢??)
       client: 
             rt := readln;
             Delete(rt,1,2); 
    self.Gauge1.MaxValue:=strtoint(copy(rt,3,length(rt)));
    self.Gauge1.Progress := 0;
             repeat
                  Application.ProcessMessages;
                  ReadStream(Fs,-1,true);
                  ct := Fs.Size;
                  self.Gauge1.Progress := ct;//下载进度
              until (not connected) or (ct >= StrToInt(rt));
      

  5.   

    client: 
             rt := readln;
             
    self.Gauge1.MaxValue:=strtoint(copy(rt,3,length(rt)));
    self.Gauge1.Progress := 0;
    Delete(rt,1,2); 
             repeat
                  Application.ProcessMessages;
                  ReadStream(Fs,-1,true);
                  ct := Fs.Size;
                  self.Gauge1.Progress := ct;//下载进度
              until (not connected) or (ct >= StrToInt(rt));