2016-02-29 27 views
-2

为什么我不能这样做?TFileStream和TMemoryStream打字

procedure TForm1.Button1Click(Sender: TObject); 
var 
    FS: TFileStream; 
begin 
    FS := TFileStream.Create('file', fmOpenRead + fmShareDenyWrite); 
    try 
    TMemoryStream(FS).SaveToFile('tempfile'); 
    finally 
    FreeAndNil(FS); 
    end; 
end; 

我有一个AStream: TStream参数的方法,并与两种类型的流的调用它。我不明白这个问题。

回答

3

你不能这样做,因为TFileStream不是TMemoryStream的后代。

事实上,为了让编译器感到高兴,你必须足够警告你的代码是错误的。你所做的只是告诉编译器闭嘴,而且你知道的更好。在这种情况下,你不会。你对编译器说谎,它会在适当的时候报复。

你真正需要的是TFile.Copy。这比使用流手动执行文件复制要好得多。关键是TFile.Copy通过操作系统,因此能够有效地复制,保留文件元数据,复制备用文件流等。

那么,至少在Windows上是如此。 Delphi支持的其他操作系统没有与Win32 CopyFile API等价的功能,因此TFile.Copy确实通过流实现了这一点。但是,让运行时库为您包装这些细节仍然是可取的。

+0

我现在明白了。我有非常困难的方法结构,现在我必须清除它。谢谢。 – Pavel