我下載一個文件在內存流是這樣的:德爾福 - 內存流下載內容的處理
ms := TMemoryStream.Create;
IdHTTP1.Get('https://dl.dropbox.com/u/21226165/XE3StylesDemo/StylesDemoSrcXE2.7z', ms);
我的問題是,如果內存流中保存任何的硬盤?
我知道一旦調用SaveToFile它會被保存到硬盤中。 但它是否自動保存到臨時文件夾或其他東西?
我下載一個文件在內存流是這樣的:德爾福 - 內存流下載內容的處理
ms := TMemoryStream.Create;
IdHTTP1.Get('https://dl.dropbox.com/u/21226165/XE3StylesDemo/StylesDemoSrcXE2.7z', ms);
我的問題是,如果內存流中保存任何的硬盤?
我知道一旦調用SaveToFile它會被保存到硬盤中。 但它是否自動保存到臨時文件夾或其他東西?
A TMemoryStream
只是堆分配內存的包裝。因此,沒有任何東西明確地保存到磁盤。如果內存被分頁,那麼它可以被保存到頁面文件中。
但分頁與課程本身無關。這只是來自操作系統的行爲,而不是由班級控制。 –
@SirRufo同意。但也許用戶認爲堆內存永遠無法找到磁盤。 –
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;
Asker希望**不能**保存到文件 –
除此之外,此代碼非常不安全。 Get方法很容易引發異常並泄漏流。而臨時文件生成功能缺少錯誤檢查。 – TLama
FWIW,Indy在'IdGlobalProtocols'單元中有它自己的'MakeTempFileName()'和'GetUniqueFileName()'函數。 –
不,它不會(因爲使用的內存交換到磁盤只要)保存任何東西到磁盤。 – TLama
再次感謝喇嘛! – MRSNAPS
我期望這個類將完成名稱所描述的內容,並且在這裏我們在內存中有一個流。 –