2010-06-21 72 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