首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tfilestream.seek和偏移混淆

tfilestream.seek和偏移混淆
EN

Stack Overflow用户
提问于 2010-06-21 20:54:26
回答 2查看 1.8K关注 0票数 4

这是摘自https://forums.embarcadero.com/message.jspa?messageID=219481的代码片段

代码语言:javascript
复制
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)在它的占位符中,如果你在下面(代码中)

代码语言:javascript
复制
// alternatively:
    // Fs.Seek(-1024, soFromEnd);

‘-1024’到底是什么?为什么总是使用1024/-1024??在偏移量paceholder中,fs.size可以单独工作吗(我正在尝试制作一个支持暂停恢复的下载管理器),在上面的代码中用tmemmorystream替换tfilestream会对程序有影响吗?

重要的是:我使用d2007和d2010

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-21 21:10:10

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2010-06-21 21:08:12

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

打个比方:你正在建造一座冰堡。天黑了,一夜之间就下起了冻雨。第二天,你拿到了电锯,锯掉了一英寸厚的污物,露出了干净的冰块。现在,您可以从那里开始构建。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3084793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档