Так вот, если происходит аварийное завершение программы, например перезагрузка, поток закачки не отрабатывает до конца и получаем на выходе файл равный размеру файла источника, но не докачанный фактически, так как закачка файла оборвана.
Программа под линукс, поэтому перехватить удаётся только сигнал SIGTERM, сигнал SIGKILL перехватить не получается, поэтому в некоторых случаях корректно отработать остановку потока закачки невозможно. Соответственно стоит задача: либо каким то образом корректно уничтожать объект файлового потока и тогда файл будет равняться фактически скаченному объёму, либо подумал сделать закачку в потоке порциями, чтобы файл получатель не был равен объёму файла источника, видимо это особенности поведения Indy и TFileStream.
Кто подскажет какие возможны варианты? Гуглить уже устал, вариантов нету пока никаких.
Вот отрывок кода что бы было понятно:
- Код: Выделить всё
var
rcvrdata: TFileStream; //файловый поток приёмник
url:UTF8String;
...
//задаём диапазон
HTTP.Request.Range:=IntToStr(StartSize)+'-'+IntToStr(FSize);
...
try
HTTP.Get(url, rcvrdata);
except
...
Всё это дело происходит в отдельном потоке
Добавлено спустя 20 часов 50 минут 33 секунды:
попытался скачивать в TMemoryStream, а потом в idHTTP.OnWork скидывать порциями в TFileStream, но потом понял что бывает приходится скачивать файлы более 1 Гб, тут проблема с расходованием памяти, поэтому отказался от этого варианта
поковырялся в idHTTP.pas, отследил последовательность используемых процедур но так и не смог понять, хотя увидел что там тоже используется TMemoryStream, правда для каждой скачиваемой порции
для меня так и остаётся нерешённый вопрос - почему при скачивании в файловый поток idHTTP приравнивает размер файла получателя файлу источнику? а не качает в поток порциями... может кто знает где рыть?