很简单的,用Indy的TCP/IP协议就可以,有现成方法!TIdTCPConnection.WriteFile Sends an operating system file to the peer on the connection.function WriteFile(const AFile: String; const AEnableTransferFile: Boolean = False): Cardinal; virtual;Parametersconst AFile: StringFile to send.const AEnableTransferFile: Boolean = FalseUse OS-specific extenstions to send the file. Default value is False.Return ValueCardinal - Number of bytes written to the peer.DescriptionWriteFile is a Cardinal function used to send the operating system file specified in AFile to the peer on the connection. WriteFile is used to transfer files in server implementations like HTTP and FTP.When AEnableTransferFile is True, Windows NT and Windows 2000 server can increase the efficiency of tile transfer operations, but cannot support TIdIntercept or progress indicators. AEnableTransferFile has no effect on Windows 95 and Windows 98.Otherwise, WriteFile calls WriteStream using a TFileStream for the file specified in AFile to perform write operations over the connection.WriteFile can raise a EIdFileNotFound exception when AFile does not exist on the local file system.

解决方案 »

  1.   

    1、使用Socket通讯,需要定协议。
    2、使用Windows的文件操作,需要有对方机器的Windows下的访问权限。
    3、使用FTP需要编写Client和Server。QQ中使用的是方法1。
      

  2.   

    给你代码,自己找一段就好了
    利用socket传输文件
    unit Unit1;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ScktComp, StdCtrls;type
    TCon = record
    FileName : String;
    TotalSize : Integer;
    Status : Integer;
    end;PCON = ^TCON;TForm1 = class(TForm)
    SS: TServerSocket;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure SSClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;var
    Form1: TForm1;implementationuses Unit2;{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
    SS.Port := 9000;
    SS.Active := True;
    end;procedure TForm1.SSClientConnect(Sender: TObject;
    Socket: TCustomWinSocket);
    var c : pcon;
    beginc :=new(pcon);
    c.FileName := '';
    c.TotalSize := 0 ;
    c.Status := 0;
    Socket.Data := c;
    Socket.SendText('已经连接,请输入UPLOAD FILENAME SIZE'#13#10);end;procedure TForm1.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var C : PCON;
    cmd:String;
    Buffer : pointer;
    nRetr : integer;
    fs : TFileStream;
    const bufferSize = 1024 ;begin
    C:= Socket.Data ;
    case c.Status of
    0 :
    begin
    cmd := trim(Socket.ReceiveText) ;if Pos('UPLOAD ',uppercase(cmd)) > 0 then
    begin
    c.FileName := trim(Copy(cmd,Pos(' ',cmd)+1,Length(cmd)));
    c.TotalSize := StrToInt(Copy(c.FileName,Pos(' ',c.FileName)+1,Length(c.FileName)));
    c.FileName := trim(Copy(c.FileName,1,Pos(' ',c.FileName)));
    c.Status := 1;
    Socket.Data := C;
    Socket.SendText('you can send File !'#13#10);
    end;
    end;
    1 : begin
    GetMem(Buffer,BufferSize);
    nRetr := Socket.ReceiveBuf(Buffer^,BufferSize);if not FIleExists('c:\'+c.FileName) then
    begin
    fs :=TFileStream.Create('c:\'+c.FileName,fmCreate or fmShareDenyNone);
    fs.Seek(0,soFromBeginning);
    end
    else
    begin
    fs :=TFileStream.Create('c:\'+c.FileName,fmOpenWrite or fmShareDenyNone);
    fs.Seek(0,soFromEnd);
    end;fs.WriteBuffer(Buffer^,nRetr);fs.Destroy;
    FreeMem(Buffer);
    end;
    end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    Form2.Show;
    end;end.
    --------------------------------------------------------------------------------
    来自:唐晓锋 时间:99-11-30 01:17:19 ID:162654
    unit Unit2;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, ScktComp;type
    TForm2 = class(TForm)
    CS: TClientSocket;
    OpenDialog1: TOpenDialog;
    Memo1: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    SendCommand: TButton;
    Label1: TLabel;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure SendCommandClick(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure CSRead(Sender: TObject; Socket: TCustomWinSocket);
    private
    { Private declarations }
    public
    { Public declarations }
    end;var
    Form2: TForm2;implementation{$R *.DFM}
    function GetFileSize(const FileName: string):integer;
    var f : TFileStream;
    begin
    f := TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
    Result :=f.Size;
    F.Free;
    end;
    procedure TForm2.Button1Click(Sender: TObject);
    begin
    with OpenDialog1 do
    begin
    Execute;
    if FileName <> '' then
    begin
    Edit1.Text := 'UPLOAD '+ ExtractFileName(FileName) +' '+Inttostr(GetFileSize(FileName));
    Label1.Caption := FileName;
    cs.Socket.SendText(edit1.Text);
    end;
    end;
    end;procedure TForm2.Button2Click(Sender: TObject);
    begin
    CS.Active := True;end;procedure TForm2.SendCommandClick(Sender: TObject);
    var fs : TFileStream;
    Buf : pointer;begin
    //CS.Socket.SendText(Edit1.Text+#13#10);
    //Memo1.Lines.Add();
    fs := TFileStream.Create(Label1.Caption ,fmOpenRead or fmShareDenyNone);GetMem(Buf,fs.Size);
    fs.Seek(0,soFromBeginning);fs.ReadBuffer(Buf^,fs.Size);memo1.Lines.Add('has send : '+inttostr(Cs.Socket.SendBuf(Buf^,fs.Size)));end;procedure TForm2.Button3Click(Sender: TObject);
    begin
    cs.Close;
    end;procedure TForm2.CSRead(Sender: TObject; Socket: TCustomWinSocket);
    beginMemo1.Lines.add(socket.receiveText);end;end.