Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Отслеживание прогресса загрузки в TIdFTPServer: руководство для Delphi

Delphi , Интернет и Сети , FTP

В статье мы рассмотрим, как отслеживать прогресс загрузки для каждого клиента, подключенного к серверу TIdFTPServer в Delphi. Хотя Indy (библиотека, в которой находится TIdFTPServer) не предоставляет встроенную поддержку мониторинга прогресса загрузки, мы покажем, как это можно реализовать с помощью наследования и переопределения методов.

Введение

TIdFTPServer — это компонент Indy, который позволяет создавать FTP-серверы в приложениях, написанных на Delphi. Иногда может возникнуть необходимость отслеживать прогресс загрузки файлов для каждого клиента, подключенного к серверу. К сожалению, Indy не предоставляет встроенную поддержку для мониторинга прогресса загрузки, но мы можем обойти это ограничение, используя наследование и переопределение методов.

Решение

Для отслеживания прогресса загрузки мы можем использовать события OnRetrieveFile и OnStoreFile, которые позволяют нам предоставить собственные объекты TStream для передачи сырого файлового содержимого. Мы можем создать собственный класс, унаследовавшийся от TStream, и переопределить виртуальные методы Read() и Write(), чтобы отслеживать прогресс загрузки.

Ниже приведен пример кода, демонстрирующий, как это можно сделать:

type
  TProgressStream = class(TStream)
  private
    FProgress: TIdTCPConnection;
    FTotalBytes: Int64;
    FBytesTransferred: Int64;
  protected
    procedure Write(const Buffer: Pointer; const Size: Int64); override;
    function Read(Buffer: Pointer; Size: Int64): Int64; override;
  public
    constructor Create(AProgress: TIdTCPConnection; ATotalBytes: Int64);
  end;

{ TProgressStream }

constructor TProgressStream.Create(AProgress: TIdTCPConnection; ATotalBytes: Int64);
begin
  inherited Create;
  FProgress := AProgress;
  FTotalBytes := ATotalBytes;
  FBytesTransferred := 0;
end;

procedure TProgressStream.Write(const Buffer: Pointer; const Size: Int64);
begin
  inherited Write(Buffer, Size);
  FBytesTransferred := FBytesTransferred + Size;
  if Assigned(FProgress) then
    FProgress.Progress := (FBytesTransferred * 100) div FTotalBytes;
end;

function TProgressStream.Read(Buffer: Pointer; Size: Int64): Int64;
begin
  Result := inherited Read(Buffer, Size);
  FBytesTransferred := FBytesTransferred + Result;
  if Assigned(FProgress) then
    FProgress.Progress := (FBytesTransferred * 100) div FTotalBytes;
end;

В этом примере мы создаем класс TProgressStream, унаследованный от TStream. В конструкторе мы инициализируем свойства FProgress, FTotalBytes и FBytesTransferred. Методы Write() и Read() переопределены для отслеживания прогресса загрузки и обновления свойства Progress у объекта TIdTCPConnection.

Использование TProgressStream

Для использования TProgressStream в своем приложении, вам нужно будет создать экземпляр этого класса и передать его в качестве параметра в методы OnRetrieveFile и OnStoreFile. Вот пример кода, показывающий, как это можно сделать:

procedure TForm1.IdFTPServer1OnRetrieveFile(AContext: TIdContext; FileName: TIdURI; Stream: TStream);
begin
  with TProgressStream.Create(AContext.Connection, FileSize(FileName)) do
    try
      AContext.GetFile(FileName, Stream);
    finally
      Free;
    end;
end;

procedure TForm1.IdFTPServer1OnStoreFile(AContext: TIdContext; FileName: TIdURI; Stream: TStream);
begin
  with TProgressStream.Create(AContext.Connection, Stream.Size) do
    try
      AContext.PutFile(FileName, Stream);
    finally
      Free;
    end;
end;

В этих примерах мы создаем экземпляр TProgressStream в начале методов OnRetrieveFile и OnStoreFile, передавая в качестве параметров объект TIdTCPConnection и размер файла. Затем мы передаем созданный экземпляр TProgressStream в методы GetFile и PutFile. finally блок гарантирует, что экземпляр TProgressStream будет правильно освобожден после завершения операции.

Заключение

Хотя Indy не предоставляет встроенную поддержку мониторинга прогресса загрузки в TIdFTPServer, мы можем обойти это ограничение, используя наследование и переопределение методов. В этой статье мы продемонстрировали, как создать собственный класс TProgressStream, унаследованный от TStream, и использовать его для отслеживания прогресса загрузки файлов для каждого клиента, подключенного к серверу. Используя этот подход, вы можете эффективно мониторить прогресс загрузки в своем приложении, написанном на Delphi.

Создано по материалам из источника по ссылке.

Статья показывает, как отслеживать прогресс загрузки для каждого клиента, подключенного к серверу TIdFTPServer в Delphi, используя наследование и переопределение методов, поскольку Indy не предоставляет встроенную поддержку мониторинга прогресса загрузки.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: FTP ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 01:10:19/0.0032169818878174/0