2014-01-10 66 views
-1

我幾乎完成了我在FreePascal/Lazarus中的第一項偉大任務,但是這個問題一直困擾着我。使用FreePascal/Lazarus刪除二進制文件的開始

該程序需要打開一個特定的二進制文件(我們稱之爲Test.exe),從文件的開頭(例如2048字節)中刪除特定數量的字節並再次寫出。 Test.exe的大小會有所不同,但總是從頭開始刪除的字節數量保持不變。

在過去的幾天裏,我一直在BlodRead/Blockwrite和TMemoryStream上進行操作,但還沒有成功完成這個看似簡單的任務。

這可能是一個很好的跡象,表明我有一些關於二進制文件處理的研究。由於這個問題實在讓我很煩惱,所以我希望我可以請你們幫忙,然後通過一種反向學習來增強我的理解力:看着期待已久的解決方案,試着去理解它,然後研究未知部分。

謝謝

/西蒙

回答

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; 

如果您需要與原來的文件名結束最後,在操作之前重命名它,從新文件名讀入並寫出舊名稱,然後在釋放(釋放)輸入流後刪除原始文件。

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;