2010-06-21 81 views
4

这是其占位符从https://forums.embarcadero.com/message.jspa?messageID=219481tfilestream.seek和偏移混乱

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? 并且会在单独的比赛中缓慢地完成比赛工作(我正在致力于 做一个下载管理和暂停恢复支持) 并且会用tmemmorystream替换tfilestream在上面的代码中有 对程序有任何影响?

如果它的问题:我用D2007和D2010

回答

4

由于这是试图建立一个下载管理器可以停止和恢复下载,这里的想法是,当你恢复,它要退后一步一点点,再要求一些先前发送不仅仅是数据的如果断开连接是由于导致接收到的数据被破坏的错误引起的。我见过的大多数下载管理者将退后至少4 KB;看起来像这个只做1 KB。

如果在占位符放fs.Size单独那就不是退一步可言,这可以让你开到损坏的数据的可能性。

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

+0

感谢梅森,+1的一个很好的和详细的答案。 我想使用memmory流,因为它具有的SaveToFile方法和TFileStream的犯规 – 2010-06-22 03:23:30

+0

@omair:TFileStream的并不需要它,因为它已经与文件相关联。你基本上是用TFileStream来代替中间人。 – 2010-06-22 03:46:37

+0

@ mason tfilestream将我们的数据保存在硬盘上,我的意思是在哪个位置? – 2010-06-22 09:08:39

6

看起来像你从文件末尾寻求在1024(0,如果该文件还没有那么大)。这一切都与恢复传输有关。你认为文件的结尾已损坏。修剪垃圾(或者从0开始),以免在糟糕之后添加好数据。

打个比方:你正在构建一个冰城堡。天黑了,你一夜间冻雨。第二天,你得到你的电锯,并看到了一英寸的泥土,暴露良好的清洁冰。现在你开始从那里建设。

+1

+1的比喻:D – 2010-06-21 14:01:17

+1

感谢4我的答案+1对于anology而言,我也是:) – 2010-06-22 03:27:14