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

Избавление от Пустых Файлов при Скачивании Изображений с Исключениями в Delphi

Delphi , Интернет и Сети , Браузер

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

Это понятно, так как поток файла создаётся непосредственно перед началом загрузки. Вот пример кода, который демонстрирует эту проблему:

FileStream := TFileStream.Create(FileName, fmCreate);
try
  Web.Get(AURL, FileStream);
finally
  FileStream.Free;
end;

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

Альтернативные способы решения проблемы

  1. Создание обёртки над TFileStream: Можно написать свою обёртку над TFileStream, которая будет отложенно создавать файл до тех пор, пока не появится данные для записи.

  2. Использование собственного класса потока файла: Можно создать собственный класс потока, который будет вызывать CreateFile с режимом обмена FILE_SHARE_DELETE и, при возникновении исключения Indy, вызывать функцию DeleteFile, которая пометит файл для удаления и удалит его, когда последний дескриптор файла будет закрыт (что произойдёт при освобождении потока).

  3. Наследование TFileStream: Можно создать наследника TFileStream с булевым членом, который будет установлен только в случае успешной загрузки, и затем в деструкторе удалить файл, если булево значение не установлено.

Удаление файла в случае исключения — это не так уж и плохо. На самом деле, это основная точка обработки исключений: это крючок для отката состояния, которое было изменено, но больше не является подходящим в результате исключения.

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

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

Альтернативный подход

Вместо загрузки всего изображения за один раз, можно рассмотреть использование HTTP-запросов на диапазоны, если сервер поддерживает это. Тогда вы можете разбить файл на меньшие части, запрашивая следующую часть после завершения предыдущей (или даже запрашивая несколько частей одновременно для увеличения производительности). Если произойдёт исключение, вы можете отменить будущие запросы, чтобы они не начинались вообще.

Этот подход может быть полезен, но он не гарантирует, что сервер поддерживает HTTP-запросы на диапазоны, так как инструмент загружает данные с произвольных URL.

Заключение

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

FileStream := TFileStream.Create(FileName, fmCreate, fmOpenRead or fmOpenWrite or fmShareDelete);
try
  Web.Get(AURL, FileStream);
  // Проверка на успешность загрузки, и только после этого можно сохранить файл
  if SuccessLoadCheck(FileStream) then
    RenameTempFileToPermanent(FileName);
finally
  FileStream.Free;
end;

Где fmShareDelete позволяет другим процессам удалить файл, пока он открыт, а функции RenameTempFileToPermanent и SuccessLoadCheck - это псевдофункции, которые должны быть реализованы согласно вашей логике работы с файлами и проверки на успешность загрузки.

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

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

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


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

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




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


:: Главная :: Браузер ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-04-29 09:57:43/0.0038018226623535/0