我几乎完成了我在FreePascal / Lazarus的第一次伟大事业,但这个问题一直困扰着我。
程序需要打开一个特定的二进制文件(让我们称之为Test.exe),从文件的开头删除特定数量的字节(例如2048字节)并再次写出来。 Test.exe的大小各不相同,但始终削减的字节数保持不变。
过去几天我一直在摆弄BlodRead / Blockwrite和TMemoryStream,但在这个看似简单的任务中还没有成功。
这可能是一个很好的迹象,我有一些关于二进制文件处理的研究。因为这个问题真让我讨厌,所以我希望我可以向你们寻求帮助,然后通过一种反向学习的方式建立我的理解:看看期待已久的解决方案,试着理解它,研究未知部分。
谢谢,
/西蒙
答案 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;