使用TFileStream将对象流式传输到文件

时间:2011-08-25 09:36:04

标签: delphi

为什么这段代码不起作用?

我正在编写一个能够保存和加载自己的文件的应用程序,并且需要知道如何使用FileStream将对象传输到文件。

procedure TForm1.btnSaveClick(Sender: TObject);
var
  fs: TFileStream;
begin
  fs := TFileStream.Create('c:\temp\a.my', fmCreate);
  try
    fs.WriteBuffer(Image1.Picture.Graphic, SizeOf(TGraphic));
  finally
    fs.Free;
  end;

  ShowMessage('ok');

  Image1.Picture.Graphic := nil;
end;

procedure TForm1.btnLoadClick(Sender: TObject);
var
  fs: TFileStream;
  g:  TGraphic;
begin
  fs := TFileStream.Create('c:\temp\a.my', fmOpenRead);
  try
    fs.ReadBuffer(g, SizeOf(TGraphic));

    Image1.Picture.Graphic := g;
  finally
    fs.Free;
  end;

  ShowMessage('ok');

end;

编辑1: 找到了做到这一点的方法,但还需要一些帮助:

procedure TForm1.btnSaveClick(Sender: TObject);
var
  fs: TFileStream;
  s:  TMemoryStream;
  buf: TBytes;
begin
  fs := TFileStream.Create('c:\temp\a.my', fmCreate);
  s  := TMemoryStream.Create;
  try
    Image1.Picture.Graphic.SaveToStream(s);

    SetLength(buf, s.Size);
    s.Position := 0;
    s.ReadBuffer(buf[0], s.Size);

    //fs.WriteBuffer(, SizeOf(Integer));  <-here how do I save an integer which represents the size of the buffer? (so that when reading back i read this first.) 

    fs.WriteBuffer(buf[0], s.Size);
  finally
    s.Free;
    fs.Free;
  end;

  ShowMessage('ok');

  Image1.Picture.Graphic := nil;
end;

1 个答案:

答案 0 :(得分:3)

你所做的是流引用,即指针。你需要流的是内容。你可以使用SaveToFile和LoadFromFile。

关于更新,请将s.Size分配给Integer类型的局部变量,然后使用WriteBuffer进行保存。相反,使用ReadBuffer读入局部变量。

如果我是你,我会直接写文件并避免记忆条纹。使用TStream的Position属性来搜索文件。所以写0表示当时的长度,写入图形,寻找回头并写出真正的长度,占长度的4个字节。