Delphi tfilestream.seek和offset混淆

Delphi tfilestream.seek和offset混淆,delphi,indy,tfilestream,Delphi,Indy,Tfilestream,这是取自 我不明白什么是偏移和偏移 为什么它的占位符中有Max(0,Fs.Size-1024) 如果你在下面(代码中) 究竟什么是“-1024”…为什么总是使用1024/-1024?? 在偏置起搏器中,fs.size单独起作用吗 使用暂停恢复支持进行下载管理) 在上面的代码中用tmemoryStream替换tfilestream会有什么好处 对节目有影响吗 如果有关系的话:我使用d2007和d2010,看起来像是从文件末尾算起1024(或者0,如果文件还没有那么大)。这一切都与恢复传输有关。您认

这是取自

我不明白什么是偏移和偏移 为什么它的占位符中有Max(0,Fs.Size-1024) 如果你在下面(代码中)

究竟什么是“-1024”…为什么总是使用1024/-1024?? 在偏置起搏器中,fs.size单独起作用吗 使用暂停恢复支持进行下载管理) 在上面的代码中用tmemoryStream替换tfilestream会有什么好处 对节目有影响吗


如果有关系的话:我使用d2007和d2010,看起来像是从文件末尾算起1024(或者0,如果文件还没有那么大)。这一切都与恢复传输有关。您认为文件的结尾已损坏。删除垃圾(或从0开始),这样就不会在坏数据之后再添加好数据


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

因为这是为了创建一个下载管理器,可以停止并恢复下载,所以这里的想法是,当您恢复时,它希望后退一步,重新请求以前发送的一些数据,以防由于错误导致断开连接,导致接收到的数据损坏。我见过的大多数下载管理器将后退至少4KB;看起来这个只有1KB

如果将fs.Size单独放在占位符中,则占位符根本不会后退,这可能会导致数据损坏


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

感谢mason,+1提供了一个好的详细答案。我想使用memmory stream,因为它有savetofile方法和tfilestreamdoesnt@omair:TFileStream不需要它,因为它已与文件关联。您使用TFileStream基本上是省去了中间人。@mason TFileStream将数据保存在硬盘上的什么位置?我的意思是在哪个位置?@omair:在您上面给出的代码示例中,它将数据保存到
dstfile
,并在数据到达时逐渐将每个数据包写入其中。@mason哪个性能更好,使用tfilestream或声明文件变量,然后使用BlockWrite(),再次感谢您的帮助和耐心:)
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;
// alternatively:
    // Fs.Seek(-1024, soFromEnd);