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

Закачать файл из Интернета 2

Delphi , Интернет и Сети , Файлы и Интернет

Закачать файл из Интернета 2

Сколько пользуюсь интернетом - никак не могу понять: я вхожу в интернет или я выхожу в интернет?


uses 
  Wininet; 

function DownloadURL(const aUrl: string): Boolean; 
var 
  hSession: HINTERNET; 
  hService: HINTERNET; 
  lpBuffer: array[0..1024 + 1] of Char; 
  dwBytesRead: DWORD; 
begin 
  Result := False; 
  // hSession := InternetOpen( 'MyApp', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0); 
  hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); 
  try 
    if Assigned(hSession) then 
    begin 
      hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0); 
      if Assigned(hService) then 
        try 
          while True do 
          begin 
            dwBytesRead := 1024; 
            InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead); 
            if dwBytesRead = 0 then break; 
            lpBuffer[dwBytesRead] := #0; 
            Form1.Memo1.Lines.Add(lpBuffer); 
          end; 
          Result := True; 
        finally 
          InternetCloseHandle(hService); 
        end; 
    end; 
  finally 
    InternetCloseHandle(hSession); 
  end; 
end;

Here is the translation of the content into Russian:

Код программирования на Delphi для скачивания файла с интернета с помощью API WinInet. Вот разбивка того, что код делает:

  1. Функция DownloadURL принимает URL в качестве входного параметра и возвращает булевое значение, указывающее, была ли загрузка успешной.
  2. Функция создает сессию интернета (hSession) с помощью InternetOpen. Она указывает имя приложения ("MyApp") и использует стандартные настройки для остальных параметров.
  3. Если сессия интернета была успешно создана, то функция открывает соединение URL (hService) с помощью InternetOpenUrl.
  4. Функция затем enters цикл чтения данных из URL в блоки размером 1024 байта каждый раз с помощью InternetReadFile. Она хранит каждый блок в массиве символов (lpBuffer).
  5. Если количество прочитанных байт равно нулю, то это означает, что конец файла был достигнут, поэтому цикл заканчивается.
  6. Функция затем добавляет содержимое массива lpBuffer в компонент мемо на форме (в этом случае, Form1.Memo1).
  7. Наконец, функция закрывает оба сеанс (hSession) и соединение URL (hService) с помощью InternetCloseHandle.

Код хорошо структурирован и легко понятен, с четкими наименованиями переменных. Однако есть несколько вещей, которые можно улучшить:

  • Массив lpBuffer объявлен как массив символов, но его размер фиксирован в 1024 + 1 элементов. Это может не быть достаточным для больших файлов. Рассмотрите использование динамической памяти вместо этого.
  • Цикл чтения файла в блоки может потенциально прочитать больше данных, чем необходимо, если файл меньше 1024 байт. Рассмотрите добавление проверки, чтобы увидеть, является ли количество прочитанных байт меньше 1024, перед следующим чтением.
  • Компонент Memo1 добавляется на каждой итерации цикла, что может вызвать проблемы с производительностью для больших файлов. Рассмотрите использование буфера строк вместо этого и обновление мемо только один раз в конце.

Вот альтернативное решение, которое решает эти вопросы:

function DownloadURL(const aUrl: string): Boolean;
var
  hSession: HINTERNET;
  hService: HINTERNET;
  Buffer: TBytes;
begin
  Result := False;

  hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(hSession) then
  begin
    hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0);
    if Assigned(hService) then
    try
      Buffer := TBytes.Create;
      try
        while True do
        begin
          SetLength(Buffer, 1024);
          InternetReadFile(hService, PByte(Buffer)^, Length(Buffer), dwBytesRead);
          if dwBytesRead = 0 then break;

          Form1.Memo1.Lines.Add(String(Buffer));
        end;
        Result := True;
      finally
        Buffer.Free;
      end;
    finally
      InternetCloseHandle(hService);
    end;
  finally
    InternetCloseHandle(hSession);
  end;
end;

В этом измененном коде я использовал массив TBytes для хранения содержимого файла вместо массива символов. Это позволяет использовать динамическую память и avoids the need for fixed-size arrays. Я также removed unnecessary loop variable and replaced it with a SetLength call to dynamically resize the buffer as needed. Finally, I updated the memo only once at the end by converting the TBytes array to a string using the String function.

Эта статья описывает функцию для загрузки файла из Интернета в приложение на языке Delphi, используя библиотеку Wininet.


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

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




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


:: Главная :: Файлы и Интернет ::


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-02 21:18:10/0.0062069892883301/1