TFileStream和TMemoryStream输入

时间:2016-02-29 10:18:02

标签: delphi delphi-xe2

为什么我不能这样做?

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参数的方法,并用两种类型的流调用它。我不明白这个问题。

1 个答案:

答案 0 :(得分:3)

您无法执行此操作,因为TFileStream不是TMemoryStream的后代。

事实上,您需要强制转换以使编译器满意的事实应该足以警告您的代码是错误的。所有演员都会告诉编译器闭嘴,你知道的更好。在这种情况下,你不会。你对编译器说谎,它会在适当的时候报复。

你真正想要的是TFile.Copy。这明显优于使用流来手动执行文件复制。关键是TFile.Copy通过操作系统进行,因此能够高效复制,保留文件元数据,复制备用文件流等。

嗯,至少在Windows上是这样。 Delphi支持的其他操作系统没有Win32 CopyFile API的等价物,因此TFile.Copy确实用流实现了这一点。但是,最好让运行时库为您包装这些详细信息。

相关问题