使用FreePascal / Lazarus删除二进制文件的开头

时间:2014-01-10 12:06:56

标签: file binary pascal freepascal lazarus

我几乎完成了我在FreePascal / Lazarus的第一次伟大事业,但这个问题一直困扰着我。

程序需要打开一个特定的二进制文件(让我们称之为Test.exe),从文件的开头删除特定数量的字节(例如2048字节)并再次写出来。 Test.exe的大小各不相同,但始终削减的字节数保持不变。

过去几天我一直在摆弄BlodRead / Blockwrite和TMemoryStream,但在这个看似简单的任务中还没有成功。

这可能是一个很好的迹象,我有一些关于二进制文件处理的研究。因为这个问题真让我讨厌,所以我希望我可以向你们寻求帮助,然后通过一种反向学习的方式建立我的理解:看看期待已久的解决方案,试着理解它,研究未知部分。

谢谢,

/西蒙

2 个答案:

答案 0 :(得分:2)

您只需要几个TFileStream个实例,并使用TStream.CopyFrom方法:

var
  FSInput, FSOutput: TFileStream;
begin
  // Create input stream (source file)
  FSInput := TFileStream.Create('Test.exe', fmOpenRead);
  try
    FSInput.Position := 2048;  // Set to whatever starting position
    FSOutput := TFileStream.Create('Test.new', fmOpenWrite);  // Create output file
    try
      FSOutput.CopyFrom(FSInput, FSInput.Size);  // Copy remaining bytes from input
    finally
      FSOutput.Free;  // Save new file to disk and free stream
    end;
  finally
    FSInput.Free;  // Free input stream
  end;
end;

如果您需要在最后使用原始文件名,只需在操作前重命名,从该新文件名读入并写出旧名称,然后在发布后删除原始文件(释放)输入流。

答案 1 :(得分:0)

var
FSInput, FSOutput: TFileStream;
begin

  // Create input stream (source file)
  FSInput := TFileStream.Create('Test.exe', fmOpenRead);
  try
     FSInput.Position := 2048;  // Set to whatever starting position
     FSOutput := TFileStream.Create('Test.new', fmOpenWrite);     // Create output file
    try
       FSOutput.CopyFrom(FSInput, FSInput.Size-FSInput.Position);  // Copy remaining bytes from input
    finally
       FSOutput.Free;  // Save new file to disk and free stream
    end;
  finally
    FSInput.Free;  // Free input stream
  end;
end;