delphi - 在 Delphi 中如何将动态数组保存到 FileStream?

标签 delphi filestream dynamic-arrays

我在 Delphi 2009 中有以下结构:

type
  IndiReportIndi = record
    IndiName: string;
    NameNum: integer;
    ReportIndiName: string;
  end;

var
  XRefList: array of IndiReportIndi;

其中 XRefList 是动态数组。

我想将 XRefList 保存到 FileStream。我该如何做到这一点并包含所有 IndiName 和 ReportIndiName 字符串,以便稍后从该 FileStream 加载时可以再次检索它们?

最佳答案

type
  IndiReportIndi = record
    IndiName: string;
    NameNum: integer;
    ReportIndiName: string;
    procedure SaveToStream(Stream: TStream);
    procedure LoadFromStream(Stream: TStream);
  end;

type
  TXRefList = array of IndiReportIndi;

function LoadString(Stream: TStream): string;
var
  N: Integer;

begin
  Result:= '';
  Stream.ReadBuffer(N, SizeOf(Integer));
  if N > 0 then begin
    SetLength(Result, N);
//    Stream.ReadBuffer(Result[1], N * SizeOf(Char));
// fast version - see comment by A.Bouchez
    Stream.ReadBuffer(Pointer(Result)^, N * SizeOf(Char));
  end;
end;

procedure SaveString(Stream: TStream; const S: string);
var
  N: Integer;

begin
  N:= Length(S);
  Stream.WriteBuffer(N, SizeOf(Integer));
  if N > 0 then
//    Stream.WriteBuffer(S[1], N * SizeOf(Char));
// fast version - see comment by A.Bouchez
    Stream.WriteBuffer(Pointer(S)^, N * SizeOf(Char));
end;

procedure IndiReportIndi.LoadFromStream(Stream: TStream);
var
  S: string;

begin
  IndiName:= LoadString(Stream);
  Stream.ReadBuffer(NameNum, SizeOf(Integer));
  ReportIndiName:= LoadString(Stream);
end;

procedure IndiReportIndi.SaveToStream(Stream: TStream);
begin
  SaveString(Stream, IndiName);
  Stream.WriteBuffer(NameNum, SizeOf(Integer));
  SaveString(Stream, ReportIndiName);
end;

function LoadXRefList(Stream: TStream): TXRefList;
var
  N: Integer;
  I: Integer;

begin
  Stream.ReadBuffer(N, SizeOf(Integer));
  if N <= 0 then Result:= nil
  else begin
    SetLength(Result, N);
    for I:= 0 to N - 1 do
      Result[I].LoadFromStream(Stream);
  end;
end;

procedure SaveXRefList(Stream: TStream; const List: TXRefList);
var
  N: Integer;
  I: Integer;

begin
  N:= Length(List);
  Stream.WriteBuffer(N, SizeOf(Integer));
  for I:= 0 to N - 1 do
    List[I].SaveToStream(Stream);
end;

关于delphi - 在 Delphi 中如何将动态数组保存到 FileStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4373418/

相关文章:

c# - 通过我的服务器将文件从远程服务器复制到客户端浏览器,而不将整个文件写入磁盘或内存

Delphi - 如何将记录添加到现有树节点

multithreading - 替换为Thread.Suspend-恢复而不影响性能

delphi - 印地 "Connection Reset by Peer"错误。特定网站上的 10054

c - 如何正确使用函数?

我可以用这段代码编写一个可变大小的数组吗?

c++ - C++ 编译器中的可变长度数组 (VLA)

delphi - 如何隐藏 TVirtualStringTree 节点?

c# - File.WriteAllBytes 或 FileStream.Write

c# - .Net 1.1 中的 FileStream 是如何实现 IDisposable 的