簡體   English   中英

讀寫二進制文件?

[英]Read and Write to Binary File?

我正在將一些自定義創建的Objects類(流數據)保存到File。

我需要能夠將File的內容加載到TStringList中,以便可以在File的末尾添加新行,然后保存更改。

但是,這不起作用,因為LoadFromFile似乎無法正確解析File。 我假設由於流中的有趣字符而將流另存為文件,並且TStringList需要純文本信息。

如何執行以下操作:

  • 將任何原始二進制文件讀入TStringList。
  • 添加我的新行,例如StringList1.Add(MyString);
  • 再次保存原始二進制文件。

這個問題實際上與我問的另一個問題有關: 將CRC值保存在文件中,而不更改實際的CRC校驗和?

這就是我想要做的:

  • 計算我保存的流文件的CRC校驗和。
  • 將CRC值添加到文件的末尾。
  • 重新保存文件。

然后,當我嘗試打開流文件時:

  • 將CRC值(在文件末尾)分配給變量。
  • 從文件中刪除CRC值。
  • 將流文件另存為新的臨時文件。
  • 計算並比較臨時文件的CRC,並將CRC存儲在變量中。
  • 如果文件的CRC與內部存儲的CRC值匹配,則可以正常處理文件。

但是我不知道如何讀取或寫入文件的原始二進制數據。

如果有人可以給我一些幫助和建議,我將不勝感激:)

此類從TStringList派生,並在寫入文件時在末尾添加一個檢查值。 每當讀取文件時,都會檢查此值。

type
  TCRCStringList = class(TStringList)
  type
    TCRC = LongWord;
  private
    function CalcCRC(Stream: TStream): TCRC;
  public
    procedure LoadFromStream(Stream: TStream; Encoding: TEncoding); override;
    procedure SaveToStream(Stream: TStream; Encoding: TEncoding); override;
  end;

function TCRCStringList.CalcCRC(Stream: TStream): TCRC;
begin
  Result := 42;  // place CRC calculation here
end;

procedure TCRCStringList.LoadFromStream(Stream: TStream; Encoding: TEncoding);
var
  crc: TCRC;
  temp: TMemoryStream;
begin
  temp := TMemoryStream.Create;
  try
    temp.CopyFrom(Stream, Stream.Size - Sizeof(crc));
    Stream.Read(crc, Sizeof(crc));
    if crc <> CalcCRC(temp) then
      raise Exception.Create('CRC error');
    temp.Position := 0;
    inherited LoadFromStream(temp, Encoding);
  finally
    temp.Free;
  end;
end;

procedure TCRCStringList.SaveToStream(Stream: TStream; Encoding: TEncoding);
var
  crc: TCRC;
  temp: TMemoryStream;
begin
  temp := TMemoryStream.Create;
  try
    inherited SaveToStream(temp, Encoding);
    temp.Position := 0;
    crc := CalcCRC(temp);
    temp.Position := temp.Size;
    temp.Write(crc, Sizeof(crc));
    Stream.CopyFrom(temp, 0); // count = 0 copies the whole stream from the beginning
  finally
    temp.Free;
  end;
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM