在局域网内进行文件异地复制功能如何实现我们平时在局域网内都是在网上邻居或者ping对方IP地址后,输入用户名密码来对文件进行操作我希望能在本地选好文件后,自动将文件传到对方机器上,当然知道对方IP及用户名密码请问如何实现

解决方案 »

  1.   

    用idftp的put方法可以实现文件上传,get方法下载
      

  2.   

    看看例子,
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ScktComp;type
      TCon = record
        FileName : String;
        TotalSize : Integer;
        Status : Integer;
      end;  PCON = ^TCON;  TForm1 = class(TForm)
        GroupBox1: TGroupBox;
        GroupBox2: TGroupBox;
        ClientSocket: TClientSocket;
        ServerSocket: TServerSocket;
        btnServerActive: TButton;
        btnClientCon: TButton;
        btnClientDisConn: TButton;
        BtnClientSendF: TButton;
        Memo1: TMemo;
        OpenDialog: TOpenDialog;
        Edit1: TEdit;
        Label1: TLabel;
        procedure btnClientConClick(Sender: TObject);
        procedure btnClientDisConnClick(Sender: TObject);
        procedure BtnClientSendFClick(Sender: TObject);
        procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
          ErrorEvent: TErrorEvent; var ErrorCode: Integer);
        procedure btnServerActiveClick(Sender: TObject);
        procedure ServerSocketClientConnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocketClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocketClientError(Sender: TObject;
          Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
          var ErrorCode: Integer);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}var  Count : Integer;function GetFileSize(const FileName: string):integer;
    var f : TFileStream;
    begin
        f := TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
        Result :=f.Size;
        F.Free;
    end;procedure TForm1.btnClientConClick(Sender: TObject);
    begin
      ClientSocket.Active := True;
      with OpenDialog do
      begin
          Execute;
          if FileName <> '' then
          begin
              Edit1.Text := 'UPLOAD '+ ExtractFileName(FileName) +' '+Inttostr(GetFileSize(FileName));
              Label1.Caption := FileName;
              ClientSocket.Socket.SendText(edit1.Text);
          end;
      end;
    end;procedure TForm1.btnClientDisConnClick(Sender: TObject);
    begin
      ClientSocket.Active := False;
    end;procedure TForm1.BtnClientSendFClick(Sender: TObject);
    var fs : TFileStream;
        Buf : pointer;
    begin
      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(ClientSocket.Socket.SendBuf(Buf^,fs.Size)));
    end;procedure TForm1.ClientSocketRead(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      Memo1.Lines.add(socket.ReceiveText);
    end;procedure TForm1.ClientSocketError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      ErrorCode := 0;
    end;procedure TForm1.btnServerActiveClick(Sender: TObject);
    begin
      ServerSocket.Active := True;
    end;procedure TForm1.ServerSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    var c : pcon;
    begin
      c :=new(pcon);
      c.FileName := '';
      c.TotalSize :=  0 ;
      c.Status := 0;
      Socket.Data := c;
      Socket.SendText('已经连接,请输入UPLOAD FILENAME SIZE'#13#10);
    end;procedure TForm1.ServerSocketClientRead(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
         Count := count + 1;
         GetMem(Buffer,BufferSize);
         nRetr := Socket.ReceiveBuf(Buffer^,BufferSize);
         Memo1.Lines.Add(IntToStr(Count) + ' ' + IntToStr(nRetr));
         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.ServerSocketClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      ErrorCode := 0;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Count := 0;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      ClientSocket.Active := False;
      ServerSocket.Active := False;
    end;end.
      

  3.   

    是否有不用ftp的方法呢,有实例否
      

  4.   


    怎么也需要在对方的计算机上运行个服务端或使用网上邻居下面的函数以'XX-XX-XX-XX-XX-XX' 的格式返回远程或本地机器的MAC地址。Function to return the MAC address of a remote or local machine in the format 'XX-XX-XX-XX-XX-XX' 返回的MAC地址是一个能用在多个方面的唯一标识。使用方法:
    ShowMessage(GetMacAddress('\\MHEYDON'); 
    输出'00-02-08-E7-99-6B'// ======================================================================
    //返回值是主机AServerName的MAC地址
    //AServerName参数的格式为'\\ServerName' 或者 'ServerName'
    //参数ServerName为空时返回本机的MAC地址
    //MAC地址以'XX-XX-XX-XX-XX-XX'的格式返回
    // ======================================================================function GetMacAddress(const AServerName: string): string;
    type
      TNetTransportEnum = function(pszServer: PWideChar;
        Level: DWORD;
        var pbBuffer: pointer;
        PrefMaxLen: LongInt;
        var EntriesRead: DWORD;
        var TotalEntries: DWORD;
        var ResumeHandle: DWORD): DWORD; stdcall;  TNetApiBufferFree = function(Buffer: pointer): DWORD; stdcall;  PTransportInfo = ^TTransportInfo;
      TTransportInfo = record
        quality_of_service: DWORD;
        number_of_vcs: DWORD;
        transport_name: PWChar;
        transport_address: PWChar;
        wan_ish: boolean;
      end;var
      E, ResumeHandle,
        EntriesRead,
        TotalEntries: DWORD;
      FLibHandle: THandle;
      sMachineName,
        sMacAddr,
        Retvar: string;
      pBuffer: pointer;
      pInfo: PTransportInfo;
      FNetTransportEnum: TNetTransportEnum;
      FNetApiBufferFree: TNetApiBufferFree;
      pszServer: array[0..128] of WideChar;
      i, ii, iIdx: integer;
    begin
      sMachineName := trim(AServerName);
      Retvar := '00-00-00-00-00-00';  // Add leading \\ if missing
      if (sMachineName <> '') and (length(sMachineName) >= 2) then
      begin
        if copy(sMachineName, 1, 2) <> '\\' then
          sMachineName := '\\' + sMachineName
      end;  // Setup and load from DLL
      pBuffer := nil;
      ResumeHandle := 0;
      FLibHandle := LoadLibrary('NETAPI32.DLL');  // Execute the external function
      if FLibHandle <> 0 then
      begin
        @FNetTransportEnum := GetProcAddress(FLibHandle, 'NetWkstaTransportEnum');
        @FNetApiBufferFree := GetProcAddress(FLibHandle, 'NetApiBufferFree');
        E := FNetTransportEnum(StringToWideChar(sMachineName, pszServer, 129), 0,
          pBuffer, -1, EntriesRead, TotalEntries, Resumehandle);    if E = 0 then
        begin
          pInfo := pBuffer;      // Enumerate all protocols - look for TCPIP
          for i := 1 to EntriesRead do
          begin
            if pos('TCPIP', UpperCase(pInfo^.transport_name)) <> 0 then
            begin
              // Got It - now format result 'xx-xx-xx-xx-xx-xx'
              iIdx := 1;
              sMacAddr := pInfo^.transport_address;          for ii := 1 to 12 do
              begin
                Retvar[iIdx] := sMacAddr[ii];
                inc(iIdx);
                if iIdx in [3, 6, 9, 12, 15] then inc(iIdx);
              end;
            end;        inc(pInfo);
          end;
          if pBuffer <> nil then FNetApiBufferFree(pBuffer);
        end;    try
          FreeLibrary(FLibHandle);
        except
          // 错误处理
        end;
      end;
      result := Retvar;
    end;