我写了一个基于IDTCPClient文件的程序!现在能传输!但是传输出来的文件有点不对!现在我将代码贴出来!比较急!解决好还可以加分!
TIdTCPClient端
procedure TRemoteControlFrm.TheFileDownLoad;
var
  DlFm: TSingleDLoadFm;
  TheDir: string;
begin
  if ListView1.Selected = nil then
  begin
    Showmessage('请选择要下载的文件');
    exit;
  end;
  TheDir := 'C:\';
  if SelectDirectory('下载到目录:', 'Desktop',TheDir ) then
  begin
    Application.CreateForm(TSingleDLoadFm, DlFm);
    DlFm.FileNameText.text := ListView1.Selected.Caption;
    DlFm.DownLoadDir.text := TheDir;
    DlFm.SrcouceDir.text := RemotePath.Text;
    DlFm.IP.Text:=IP.Caption;
    DlFm.Show;
  end;
end;unit SingleDLoadUnit;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, Buttons, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdGlobal, ShellAPI;type
  TSingleDLoadFm = class(TForm)
    Animate1: TAnimate;
    Panel1: TPanel;
    CheckBox1: TCheckBox;
    BitBtn2: TBitBtn;
    BitBtn1: TBitBtn;
    Bevel1: TBevel;
    ProgressBar1: TProgressBar;
    BitBtn3: TBitBtn;
    DownLoadTcp: TIdTCPClient;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    FileNameText: TEdit;
    DownLoadDir: TEdit;
    SrcouceDir: TEdit;
    SaveDialog1: TSaveDialog;
    IP: TEdit;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure DownLoadTcpWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    procedure DownLoadTcpWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    procedure DownLoadTcpWork(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure SrcouceDirMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
    TmpFName: string;
    AlreadyReadLen, ReadFileLen: integer;
    DownStream, ExistStream: TMemoryStream;
  public
    { Public declarations }
  end;implementation
var
  SingleDLoadFm: TSingleDLoadFm;  {$R *.dfm}procedure TSingleDLoadFm.BitBtn1Click(Sender: TObject);
var
  RetStr: string;
  iReturn: integer;
  SaveFStream: TFileStream;
begin
  begin //============================================================
    Animate1.Active := True;
    Bitbtn1.Enabled := False;
    try //发送下载的文件
      DownLoadTcp.Write('文件下载' + EOL); //1-------SendfileCMD
      DownLoadTcp.Write(SrcouceDir.Text + FileNameText.Text + EOL); //2-------SendfileName
    except
      DownLoadTcp.Disconnect;
      Animate1.Active := False;
      beep;
      Self.Caption := '提示:网络信息发送失败!';
      exit;
    end;
    TmpFName := DownLoadDir.Text + FileNameText.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);      //OK
    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);
      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 := '提示:网络连接失败!';
end;procedure TSingleDLoadFm.BitBtn2Click(Sender: TObject);
begin
  Animate1.Active := false;
  DownLoadTcp.Disconnect;
  close;
end;procedure TSingleDLoadFm.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  DownLoadTcp.Disconnect;
  DownStream.Free;
  ExistStream.Free;
end;procedure TSingleDLoadFm.FormCreate(Sender: TObject);
begin
  ProgressBar1.Position := 0;
  DownStream := TMemoryStream.Create;
  ExistStream := TMemoryStream.Create;
          DownLoadTcp.Host:=Ip.Text;
          DownLoadTcp.Port:=6000;
          if  not DownLoadTcp.Connected then DownLoadTcp.Connect;
end;procedure TSingleDLoadFm.BitBtn3Click(Sender: TObject);
begin
  ShellExecute(Application.Handle, 'OPEN',
    PChar(TmpFName), '', '', SW_SHOWNORMAL);
  Close;
end;procedure TSingleDLoadFm.DownLoadTcpWorkBegin(Sender: TObject;
  AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
  ProgressBar1.Position := 0;
  ProgressBar1.Max := AlreadyReadLen + AWorkCountMax;
end;procedure TSingleDLoadFm.DownLoadTcpWorkEnd(Sender: TObject;
  AWorkMode: TWorkMode);
begin
  Self.Caption := '下载完毕!共下载文件' + IntToStr(ReadFileLen + AlreadyReadLen)
    + '字节';
end;procedure TSingleDLoadFm.DownLoadTcpWork(Sender: TObject;
  AWorkMode: TWorkMode; const AWorkCount: Integer);
var
  ThePos: int64;
begin
  ThePos := ProgressBar1.Position;
  ProgressBar1.Position := AlreadyReadLen + AWorkCount;
  Self.Caption := '正在下载:' +
    IntToStr(ThePos * 100 div ProgressBar1.Max) + '%';
end;procedure TSingleDLoadFm.SrcouceDirMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  (Sender as TEdit).Hint := (Sender as TEdit).Text;
end;end.

解决方案 »

  1.   

    TIdTCPServer端
    控件试卷给个大概
    procedure TMainFrm.IdTCPServerExecute(AThread: TIdPeerThread);
    var
      Operation,filename,CmdIni,CMDType,SvrName,SharePath: string;
      ProID,SvrOP:integer;
      SP: PChar;
    begin
      if Assigned(AThread) then
      begin
        with AThread.Connection do
        begin
          try
            Operation := ReadLn;
            if trim(Operation) <> '' then
            begin
               if Operation = '文件下载' then
                  begin
                      DownLoadFileProc(AThread);
                  end
      end;
    end;、、、、、、、、、、、、、、、、、、、、
    procedure DownLoadFileProc(AThread: TIdPeerThread);
    var
      DownLoadThread: TDownLoadThread; //按位置下载文件
      TheFileName: string;
      ThePosition: integer;
      FromF: file of byte;
      FileLen: integer;
    begin
      try
        TheFileName := AThread.Connection.ReadLn(EOL);
        ThePosition := AThread.Connection.ReadInteger;
      except
        AThread.Connection.Disconnect;
        exit;
      end;
      if FileExists(TheFileName) then
      begin    try
          AThread.Connection.Write('OK' + EOL);
        except
          AThread.Connection.Disconnect;
          exit;
        end;
        try
          DownLoadThread := TDownLoadThread.Create(AThread,
            TheFileName, ThePosition);
          exit;
        except
          AThread.Connection.Disconnect;
          exit;
        end;
      end
      else
      begin
        try
          AThread.Connection.Write('文件不存在' + EOL);
          AThread.Connection.Disconnect;
        except
          AThread.Connection.Disconnect;
        end;
      end;
    end;
    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
    unit DownLoadFileUnit;interfaceuses
      Classes, IdTCPServer, IdGlobal, ComCtrls, SysUtils;type
      TDownLoadThread = class(TThread)
      private
        TheFileName, TheUserName: string;
        ThePosition: integer;
        SysThread: TIdPeerThread;
      protected
        procedure Execute; override;
      public
        constructor Create(AThread: TIdPeerThread; TFN: string; ThePos:
          integer);
        destructor Destroy; override;
      end;implementation
    constructor TDownLoadThread.Create(AThread: TIdPeerThread;
      TFN: string; ThePos: integer);
    begin
      inherited Create(True);
      TheFileName := TFN;
      ThePosition := ThePos;
      SysThread := AThread;
      FreeOnTerminate := True;
      Suspended := false;
    end;procedure TDownLoadThread.Execute;
    var
      FromF: file of byte;
      FileLen: integer;
      NumRead, NumWritten: Integer;
      Buf: array[1..32768] of Char;
      tmStr:Tmemorystream;
    begin
      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);  
    end;destructor TDownLoadThread.Destroy;
    begin
      inherited destroy;
    end;
    end.
      

  2.   

    下面些个简单点的!简单的说现在我传输过去的是如果是txt文件!打开就是乱码!但感觉里面的数字没变!别的传过去只是大小一样!
      

  3.   

    cliect
    procedure DownLoadFileProc(AThread: TIdPeerThread);
    var
      DownLoadThread: TDownLoadThread; //按位置下载文件
      TheFileName: string;
      ThePosition: integer;
      FromF: file of byte;
      FileLen: integer;
      FileStream:TMemoryStream;
      fStream:TMemoryStream;
    begin
      try
        TheFileName := AThread.Connection.ReadLn(EOL);
        ThePosition := AThread.Connection.ReadInteger;
      except
        AThread.Connection.Disconnect;
        exit;
      end;
      if FileExists(TheFileName) then
      begin
          DownLoadThreadExecute(AThread,TheFileName, ThePosition);
      end
      else
      begin
        try
          AThread.Connection.Write('文件不存在' + EOL);
          AThread.Connection.Disconnect;
        except
          AThread.Connection.Disconnect;
        end;
      end;
    end;procedure DownLoadThreadExecute(AThread: TIdPeerThread; TheFileName: string; ThePosition:integer);
    var
      FromF: file ;
      FileLen,BufferTotalNum: integer;
      NumRead, NumWritten: Integer;
      Buf: array[1..32768] of Char;
      tmStr:Tmemorystream;
    begin
      try
        AssignFile(FromF, TheFileName);
        FileMode := 0;
        Reset(FromF,1);
        FileLen := FileSize(FromF);
        Seek(FromF, ThePosition);
      except
        try
          CloseFile(FromF);
        except
        end;
        exit;
      end;
      try
        AThread.Connection.Write('OK'+inttostr(FileLen-ThePosition)+EOL);
      except
        CloseFile(FromF);
        exit;
      end;
        NumRead:=0;
        BufferTotalNum:=ThePosition;  repeat
        try
          AThread.Connection.OpenWriteBuffer;
          BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
          AThread.Connection.WriteBuffer(Buf, NumRead);
          AThread.Connection.CloseWriteBuffer;
          BufferTotalNum:=BufferTotalNum+NumRead;
        except
          CloseFile(FromF);
          exit;
        end;
      until (BufferTotalNum=FileLen);
      CloseFile(FromF);
      if AThread.Connection.Connected then
      AThread.Connection.Disconnect;end;
      

  4.   

    server端    try //发送下载的文件
          DownLoadTcp.Write('文件下载' + EOL); //1-------SendfileCMD
          DownLoadTcp.Write(SrcouceDir.Text + FileNameText.Text + EOL); //2-------SendfileName
        except
          DownLoadTcp.Disconnect;
          Animate1.Active := False;
          beep;
          Self.Caption := '提示:网络信息发送失败!';
          exit;
        end;
        TmpFName := DownLoadDir.Text + FileNameText.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
          RetStr := DownloadTcp.ReadLn(EOL);      //OK
        except
          SaveFStream.free;
          DownLoadTcp.Disconnect;
          Animate1.Active := False;
          Self.Caption := '错误提示:远程网络断开,接收失败!';
          exit;
        end;    if copy(RetStr,1,2) = 'OK' then //------------------------读取接收标志
        begin //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          //读数据------------------------开始-----
         try 
              Delete(RetStr,1,2);
              ReadFileLen:=strtoint(RetStr);//文件大小
          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);
          DownLoadTcp.Disconnect;
          Animate1.Active := False;
          if checkBox1.Checked then Close;
          exit;
        end;