这是摘自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;我不明白什么是off,为什么Max(0,Fs.Size-1024)在它的占位符中,如果你在下面(代码中)
// alternatively:
// Fs.Seek(-1024, soFromEnd);‘-1024’到底是什么?为什么总是使用1024/-1024??在偏移量paceholder中,fs.size可以单独工作吗(我正在尝试制作一个支持暂停恢复的下载管理器),在上面的代码中用tmemmorystream替换tfilestream会对程序有影响吗?
重要的是:我使用d2007和d2010
发布于 2010-06-21 21:10:10
因为这是试图创建一个可以停止和恢复下载的下载管理器,所以这里的想法是,当您恢复时,它想要后退一点,并重新请求以前发送的一些数据,以防断开连接是由导致接收的数据损坏的错误引起的。我见过的大多数下载管理器都会后退至少4KB;看起来这个下载管理器只会后退1KB。
如果您将fs.Size单独放在占位符中,那么它根本不会后退,这可能会使您面临数据损坏的可能性。
用TMemoryStream替换TFileStream将意味着你下载到内存而不是磁盘,如果电脑崩溃或断电或你的应用程序以某种方式崩溃,所有的进展都会丢失。所以这不是个好主意。此外,下载到RAM会将下载的大小限制为地址空间的可用大小,这将使下载大文件(例如,DVD的ISO)变得不可能,或者至少比需要的困难得多。
发布于 2010-06-21 21:08:12
看起来您正在从文件末尾开始查找1024 (如果文件还没有那么大,则为0 )。这一切都与恢复传输有关。您认为文件的末尾已损坏。去掉垃圾(或者从0开始),这样你就不会在坏的数据之后添加好的数据。
打个比方:你正在建造一座冰堡。天黑了,一夜之间就下起了冻雨。第二天,你拿到了电锯,锯掉了一英寸厚的污物,露出了干净的冰块。现在,您可以从那里开始构建。
https://stackoverflow.com/questions/3084793
复制相似问题