-1

我正在使用 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;
4

1 回答 1

1

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

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;
于 2013-11-10T17:44:07.853 回答