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

Устранение Проблем Скачивания Файлов в Delphi XE2 с Использованием Wininet

Delphi , ОС и Железо , Windows

Вопрос скачивания файлов в среде Delphi является актуальным для многих разработчиков, особенно если речь идет о использовании только компонентов WinINet без прибегания к UrlMon.dll. В данной статье мы рассмотрим типичную проблему, с которой сталкиваются пользователи при скачивании файлов в Delphi XE2, а также предложим рабочий вариант решения.

Описание Проблемы

Разработчик столкнулся с проблемой, при которой код для скачивания файла, использующий WinINet, создавал файл в указанном пути, но после завершения работы программы файл оказывался пустым. Проблема заключалась, вероятно, в некорректной работе цикла и переменной ReadNext.

Контекст

Код, представленный разработчиком, использовал функции WinINet для чтения данных из URL и записи их в файл на диске. Однако, несмотря на внешне корректную работу, файл в итоге оказывался пустым.

Анализ Проблемы

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

Подтвержденный Ответ

Пользователь TLama предложил улучшенный вариант кода, который успешно решает проблему скачивания файла:

procedure DownloadFile(URL: string; Path: string);
const
  BLOCK_SIZE = 1024;
var
  InetHandle: Pointer;
  URLHandle: Pointer;
  FileHandle: Cardinal;
  BytesRead: Cardinal;
  Buffer: array [1 .. BLOCK_SIZE] of byte;
  BytesWritten: Cardinal;
begin
  InetHandle := InternetOpen(PChar(URL), 0, 0, 0, 0);
  if not Assigned(InetHandle) then RaiseLastOSError;
  try
    URLHandle := InternetOpenUrl(InetHandle, PChar(URL), nil, 0, 0, 0);
    if not Assigned(URLHandle) then RaiseLastOSError;
    try
      FileHandle := CreateFile(PChar(Path), GENERIC_WRITE, FILE_SHARE_WRITE, 0,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
      if FileHandle = INVALID_HANDLE_VALUE then RaiseLastOSError;
      try
        repeat
          if not InternetReadFile(URLHandle, @Buffer, BLOCK_SIZE, BytesRead) then
            RaiseLastOSError;
          if BytesRead = 0 then
            Break;
          if not WriteFile(FileHandle, Buffer, BytesRead, BytesWritten, nil) then
            RaiseLastOSError;
        until False;
      finally
        CloseHandle(FileHandle);
      end;
    finally
      InternetCloseHandle(URLHandle);
    end;
  finally
    InternetCloseHandle(InetHandle);
  end;
end;

Изменения, внесенные TLama, включают в себя:

  • Использование буфера фиксированного размера.
  • Проверка результата вызова функции WriteFile и поднятие исключения, если функция возвращает False.
  • Использование PChar вместо PWideChar, что важно для корректной работы в Delphi 7 и более ранних версиях.
  • Использование блоков try..finally для закрытия открытых дескрипторов.
  • Выход из цикла, когда BytesRead равен 0, что указывает на завершение чтения данных.

Альтернативный Ответ

В комментариях подчеркивается, что WinINet является устаревшим и рекомендуется использовать WinHTTP. Однако, если использовать WinINet, важно правильно обрабатывать результаты функций и использовать безопасные практики управления ресурсами.

Пример Вызова

DownloadFile('https://dl.dropbox.com/u/21226165/XE3StylesDemo/StylesDemoSrcXE2.7z', '.\StylesDemoXE2.7z');

Этот вызов должен успешно скачать файл в указанный путь.

Заключение

Проблема скачивания файлов в Delphi XE2 с использованием WinINet может быть решена с помощью корректной обработки данных и правильного использования функций управления ресурсами. Приведенный выше код является рабочим решением, которое можно адаптировать для использования в проектах, использующих Delphi 7 и более новые версии.

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

Проблема заключается в том, что при использовании компонентов WinINet в Delphi XE2 для скачивания файлов, код, написанный разработчиком, по неизвестным причинам не сохраняет данные в файл, оставляя его пустым после выполнения программы.


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

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




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


:: Главная :: Windows ::


реклама


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

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