tfilestream.seek и смещение путаницы - PullRequest
4 голосов
/ 21 июня 2010

это фрагмент кода, взятый из https://forums.embarcadero.com/message.jspa?messageID=219481

if FileExists(dstFile) then
begin
  Fs := TFileStream.Create(dstFile, fmOpenReadWrite);
  try
    Fs.Seek(Max(0, Fs.Size-1024), soFromBeginning);
    // alternatively:
    // Fs.Seek(-1024, soFromEnd);
    Http.Request.Range := IntToStr(Fs.Position) + '-';
    Http.Get(Url, Fs);
  finally
    Fs.Free;
  end;
end;

я не понимаю, что именно смещено и почему Max (0, Fs.Size-1024) в качестве заполнителя и если вы идете ниже (в коде)

// alternatively:
    // Fs.Seek(-1024, soFromEnd);

что такое '-1024' ... почему всегда используют 1024 / -1024 ?? и будет fs.size один в работе смещения темпа (я пытаюсь сделать загрузку управлять паузой возобновить поддержку) и будет замена tfilestream на tmemmorystream в приведенном выше коде какое-либо влияние на программу?

если это имеет значение: я использую d2007 и d2010

Ответы [ 2 ]

6 голосов
/ 21 июня 2010

Похоже, что вы ищете 1024 от конца файла (или 0, если файл еще не такой большой).Это все связано с возобновлением передачи.Вы полагаете, что конец вашего файла поврежден.Обрежьте дерьмо (или начните заново с 0), чтобы не добавлять хорошие данные после плохих.

Аналогия: вы строите ледяной замок.Становится темно, и за ночь вы получаете ледяной дождь.На следующий день вы получаете бензопилу и отпиливаете навоз, обнажая хороший чистый лед.Теперь вы начинаете строить оттуда.

4 голосов
/ 21 июня 2010

Поскольку он пытается создать менеджер загрузок, который может останавливать и возобновлять загрузки, идея заключается в том, что при возобновлении он хочет немного отступить назад и повторно запросить некоторые данные, которые ранее были отправлены только вВ этом случае отключение было вызвано ошибкой, вызвавшей повреждение полученных данных.Большинство менеджеров закачек, которые я видел, отступят как минимум на 4 КБ;Похоже, что это только 1 КБ.

Если вы поместите fs.Size в заполнитель в одиночку, тогда он вообще не отступит, что может привести к повреждению данных.

А замена TFileStream на TMemoryStream будет означать, что вы загружаете в ОЗУ, а не на диск, и если компьютер падает или теряет питание, или ваше приложение каким-то образом падает, весь прогресс теряется.Так что это не очень хорошая идея.Кроме того, загрузка в ОЗУ ограничивает размер вашей загрузки доступным размером вашего адресного пространства, что делает загрузку больших файлов (например, ISO-дисков DVD) либо невозможной, либо, по крайней мере, намного более сложной, чем это необходимо.

...