tfilestream.seek和偏移混淆

时间:2010-06-21 12:54:26

标签: delphi indy tfilestream

这是从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

2 个答案:

答案 0 :(得分:6)

看起来你正在寻找文件末尾的1024(或0,如果文件还不是那么大)。这都与恢复传输有关。你认为文件的末尾已损坏。修剪废话(或从0开始),这样你就不会在糟糕的情况下添加好的数据。

打个比方:你正在建造一座冰城堡。天黑了,你一夜之间就会下大雨。第二天,你拿到电锯,看到一英寸的碎屑,露出干净的冰块。现在你从那里开始建设。

答案 1 :(得分:4)

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

如果你将fs.Size单独放在占位符中,那么它根本不会退回,这可能会让你对数据损坏的可能性持开放态度。

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