【问题标题】:P2P file transfer by TIdtrivialftp通过 TIdtrivialftp 进行 P2P 文件传输
【发布时间】:2013-11-10 14:48:38
【问题描述】:

我正在使用 Tidtrivialftpserver 和 Tidtrivialftp 通过 LAN 传输文件。我尝试了示例代码并且工作正常,但 Tidtrivialftpserver 刚刚开始写入文件,我想实现一个保存对话框,以便我可以将它保存在我想要的位置。我尝试了以下但它在当前目录中写入文件。我也不相信 serverWriteFile 中的这一行(AStream := FS),因为当我调试此代码时,Astream 给出了 nil 但它仍然写入文件。怎么样?

var 
  file1: string;
  FS: tfilestream;

procedure TForm2.saveClick(Sender: TObject);
begin
  if savedialog1.Execute then
  begin
   savedialog1.FileName:= file1;
    FS := TFileStream.Create(FileName,
    fmCreate or fmShareExclusive);
  end;
end;   

procedure TForm2.serverWriteFile(Sender: TObject; var FileName: string;
  const PeerInfo: TPeerInfo; var GrantAccess: Boolean; var AStream: TStream;
  var FreeStreamOnComplete: Boolean);
begin
  try
    Memo1.Lines.Add('started writing files...');
    file1 := ExtractFileName(Filename);
    { Open file in WRITE ONLY mode }
    //  FS := TFileStream.Create(FileName,
    //  fmCreate or fmShareExclusive);
    { Copy all the data }
    AStream := FS;
    { Set parameters }
    FreeStreamOnComplete := True;
    GrantAccess := True;
  except
    { On errors, deny access }
    GrantAccess := False;
    if Assigned(FS) then
    FreeAndNil(FS);
  end;
end;

【问题讨论】:

    标签: delphi delphi-xe3 indy10


    【解决方案1】:

    OnWriteFile 事件的目的是请求接收文件的权限(GrantAccess,默认为 True)并获得一个TStream 以将文件数据接收到(AStream,其中默认为零)。 TIdTrivialFTPServer 在事件处理程序首先退出之前无法接收数据。如果您不提供TStream,但将GrantAccess 设置/保留为True,TIdTrivialFTPServer 将使用当前FileName 在内部创建自己的TFileStream。因此,如果您不想接收该文件,则必须将GrantAccess 设置为 False。如果要提示用户,必须在OnWriteFile 事件处理程序内部进行(只有在TIdTrivialFTPServer.ThreadEvent 属性为False 时直接这样做才是安全的,否则需要与主线程同步才能进行提示安全),例如:

    procedure TForm2.serverWriteFile(Sender: TObject; var FileName: string;
      const PeerInfo: TPeerInfo; var GrantAccess: Boolean; var AStream: TStream;
      var FreeStreamOnComplete: Boolean);
    begin
      SaveDialog1.FileName := ExtractFileName(FileName);
      if SaveDialog1.Execute then
      begin
        // let TIdTrivialFTPServer create the TFileStream internally...
        FileName := SaveDialog1.FileName;
        Memo1.Lines.Add('started writing file...');
      end else
        GrantAccess := False;
    end;
    

    【讨论】:

    • 是的,非常感谢,这是正确的方法,但我想在单击保存按钮时执行保存对话框(因为文件接收到的保存按钮变得可见),但是通过这种方法,一个对话框将自行出现。
    • 你没有抓住重点。当服务器收到接收文件的新请求时,它会触发OnWriteFile 事件以找出可以保存文件的位置。您可以单独提示的唯一方法是,如果您先将文件接收到临时文件或内存流,然后提示,然后在完全上传后将临时文件/内存移动到所选目标。这比在允许开始上传之前简单地提示 OnWriteFile 事件要多得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多