2013-11-10 3 views
-1

Передача файлов по локальной сети с использованием Tidtrivialftpserver и Tidtrivialftp. Я попробовал код примера и отлично работает, но Tidtrivialftpserver только начинает записывать файл, я хочу реализовать окно saveialog, чтобы я мог сохранить его на нужном месте. Я попытался следовать, но он записывает файл в текущий каталог. Также я не уверен в этой строке (AStream: = FS) в serverWriteFile, потому что, когда я отлаживаю этот код, Astream дает нуль, но все же записывает файл. Как?Передача файла P2P по TIdtrivialftp

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; 

ответ

1

Цель OnWriteFile мероприятия просить разрешение на получение файла (GrantAccess, который истинно по умолчанию) и получить TStream получить данные файла в (AStream, который равен нулю по умолчанию). TIdTrivialFTPServer не может получить данные до тех пор, пока обработчик событий не выйдет первым. Если вы не указали TStream, но установите/оставьте GrantAccess на значение True, TIdTrivialFTPServer создаст свой собственный TFileStream внутренне с использованием текущего FileName. Поэтому, если вы не хотите получать файл, вы должны установить 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; 
+0

Да, спасибо большое, это правильный путь, но я хочу, чтобы диалог сохранения был нажат кнопку «Сохранить» (по мере того, как кнопка сохранения файла становится видимой), но этим методом диалог появится сам по себе. – rafay

+0

Вам не хватает точки. Когда сервер получает новый запрос на получение файла, он запускает событие 'OnWriteFile', чтобы узнать, где он может сохранить файл. Единственный способ, который вы можете запросить отдельно, - это сначала получить файл в файл temp или поток памяти, затем запросить, а затем переместить временный файл/память в выбранный пункт назначения после его полной загрузки. Это намного больше работы, чем просто запрос в событии «OnWriteFile» до начала загрузки. –