Скачивание файла в Delphi - PullRequest
       0

Скачивание файла в Delphi

13 голосов
/ 17 августа 2010

Поиск в Google показывает несколько примеров того, как загрузить файл в Delphi, но большинство из них содержат ошибки и половина времени не работает по моему опыту.

Я ищу простое надежное решение, которое позволит мне загрузить один exe-файл (для обновления моего приложения) и будет удерживать выполнение текущего потока обновления до тех пор, пока загрузка не будет завершена или не произойдет ошибка.Процесс уже является многопоточным, поэтому код загрузки должен содержать выполнение до тех пор, пока он не будет завершен (надеюсь).

Вот две реализации, обе кажутся очень сложными
1. http://www.scalabium.com/faq/dct0116.htm
2. http://delphi.about.com/od/internetintranet/a/get_file_net.htm

Ответы [ 3 ]

16 голосов
/ 18 августа 2010

Почему бы не использовать инди.Если вы используете TIdHTTP, его просто

procedure DownloadFile;    
var
  IdHTTP1: TIdHTTP;
  Stream: TMemoryStream;
  Url, FileName: String;
begin    
  Url := 'http://www.rejbrand.se';
  Filename := 'download.htm';

  IdHTTP1 := TIdHTTP.Create(Self);
  Stream := TMemoryStream.Create;
  try
    IdHTTP1.Get(Url, Stream);
    Stream.SaveToFile(FileName);
  finally
    Stream.Free;
    IdHTTP1.Free;
  end;
end;

Вы даже можете добавить индикатор выполнения, используя события OnWork и OnWorkBegin

procedure IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;AWorkCountMax: Int64);
begin
  ProgressBar.Max := AWorkCountMax;
  ProgressBar.Position := 0;
end;

procedure IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
  ProgressBar.Position := AWorkCount;
end;

Я не уверен, что эти события возникаютконтекст основного потока, поэтому любые обновления, выполняемые для компонентов VCL, возможно, придется выполнять с использованием компонента tidnotify для устранения проблем с многопоточностью.Может быть, кто-то еще может проверить это.

15 голосов
/ 17 августа 2010

Второй подход - это стандартный способ использования интернет-ресурсов с использованием WinINet, части Windows API. Я использовал это много, и это всегда работало хорошо. Первый подход я никогда не пробовал. (Ни один из них не является «очень сложным». При использовании Windows API всегда будет несколько дополнительных шагов.)

Если вы хотите очень простой метод, вы можете просто вызвать UrlMon.URLDownloadToFile. Вы не получите никакого точного контроля (вообще!) О загрузке, но это очень просто.

Пример:

URLDownloadToFile(nil,
                  'http://www.rejbrand.se',
                  PChar(ExtractFilePath(Application.ExeName) + 'download.htm'),
                  0,
                  nil);
0 голосов
/ 01 октября 2018

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

errcode := URLMon.URLDownloadToFile(nil,
                      PChar('http://www.vbforums.com/showthread.php?345726-DELPHI-Download-Files'),
PChar( 'a:\download.htm'),
      0,
      nil);
if errcode > 0 then
      showmessage('Error while downloading: ' + inttostr(errcode));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...