4

这是取自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 会单独在偏移领跑者工作中(我正在尝试使用暂停恢复支持进行下载管理)并且在上面的代码中用 tmemmorystream 替换 tfilestream 会对程序产生任何影响吗?

如果重要:我使用 d2007 和 d2010

4

2 回答 2

6

看起来您正在从文件末尾寻找 1024(或 0,如果文件还没有那么大)。这一切都与恢复传输有关。您认为文件的末尾已损坏。修剪掉废话(或从 0 开始),这样您就不会在坏数据之后添加好数据。

类比:你正在建造一座冰城堡。天黑了,你会在一夜之间下冻雨。第二天,你拿起你的电锯,锯掉了一英寸的碎屑,露出干净的冰块。现在你从那里开始建造。

于 2010-06-21T13:08:11.540 回答
4

由于这是试图创建一个可以停止和恢复下载的下载管理器,这里的想法是,当您恢复时,它想要退后一点并重新请求之前发送的一些数据,以防断开连接是由导致接收到的数据损坏的错误引起的。我见过的大多数下载管理器都会后退至少 4 KB;看起来这个只做 1 KB。

如果您将 fs.Size 单独放在占位符中,那么它根本不会后退,这可能会让您面临数据损坏的可能性。

用 TMemoryStream 替换 TFileStream 意味着您正在下载到 RAM 而不是磁盘,如果计算机崩溃或断电或您的应用程序以某种方式崩溃,所有进度都会丢失。所以这不是一个好主意。此外,下载到 RAM 将下载的大小限制为地址空间的可用大小,这将使下载大文件(例如 DVD 的 ISO)要么不可能,要么至少比需要的要困难得多。

于 2010-06-21T13:10:09.820 回答