2015-09-06 50 views
1

我下載一個文件在內存流是這樣的:德爾福 - 內存流下載內容的處理

ms := TMemoryStream.Create; 
    IdHTTP1.Get('https://dl.dropbox.com/u/21226165/XE3StylesDemo/StylesDemoSrcXE2.7z', ms); 

我的問題是,如果內存流中保存任何的硬盤?

我知道一旦調用SaveToFile它會被保存到硬盤中。 但它是否自動保存到臨時文件夾或其他東西?

+4

不,它不會(因爲使用的內存交換到磁盤只要)保存任何東西到磁盤。 – TLama

+0

再次感謝喇嘛! – MRSNAPS

+1

我期望這個類將完成名稱所描述的內容,並且在這裏我們在內存中有一個流。 –

回答

3

A TMemoryStream只是堆分配內存的包裝。因此,沒有任何東西明確地保存到磁盤。如果內存被分頁,那麼它可以被保存到頁面文件中。

+3

但分頁與課程本身無關。這只是來自操作系統的行爲,而不是由班級控制。 –

+0

@SirRufo同意。但也許用戶認爲堆內存永遠無法找到磁盤。 –

0

TMemoryStream是與內存的工作,但如果你想直接保存到臨時使用TFileStream

// Creates a name for a temporary file. 
Function TempFileName(): string; 
var 
    // This buffer should be MAX_PATH characters to accommodate the path plus the terminating null character. 
    lpTempFileName: array[0..MAX_PATH] of Char; 
    tempdir: array[0..MAX_PATH] of Char; 
begin 
    GetTempPath(MAX_PATH, tempdir); 
    GetTempFileName(tempdir, nil, 0, lpTempFileName); 
    Result := lpTempFileName; 
end; 

procedure TForm1.btn1Click(Sender: TObject); 
var 
    fs : TFileStream; 
    tmpFile : string; 
begin 
    tmpFile := TempFileName; 
    fs := TFileStream.Create(tmpFile, fmCreate); 
    try 
    IdHTTP1.Get('http://www.bing.com/az/hprichbg/rb/BrooklynHeights_ROW10562657125_1366x768.jpg', fs); 
    finally 
    fs.Free; 
    end; 
end; 
+0

Asker希望**不能**保存到文件 –

+3

除此之外,此代碼非常不安全。 Get方法很容易引發異常並泄漏流。而臨時文件生成功能缺少錯誤檢查。 – TLama

+2

FWIW,Indy在'IdGlobalProtocols'單元中有它自己的'MakeTempFileName()'和'GetUniqueFileName()'函數。 –