0
我正在處理一個小字節修補程序,但遇到了一個錯誤。複製文件在fmOpenReadWriteMode中打開時失敗
修改之前複製文件失敗,沒有錯誤,(沒有看到複製的輸出),但文件修補程序成功。
這裏是補丁代碼
procedure DoMyPatch();
var
i: integer;
FileName: string;
input: TFileStream;
FileByteArray, ExtractedByteArray: array of Byte;
begin
FileName := 'Cute1.res';
try
input := TFileStream.Create(FileName, fmOpenReadWrite);
except
begin
ShowMessage('Error Opening file');
Exit;
end
end;
input.Position := 0;
SetLength(FileByteArray, input.size);
input.Read(FileByteArray[0], Length(FileByteArray));
for i := 0 to Length(FileByteArray) do
begin
SetLength(ExtractedByteArray, Length(OriginalByte));
ExtractedByteArray := Copy(FileByteArray, i, Length(OriginalByte));
// function that compares my array of bytes
if CompareByteArrays(ExtractedByteArray, OriginalByte) = True then
begin
// Begin Patching
CopyFile(PChar(FileName), PChar(ChangeFileExt(FileName, '.BAK')),
true); =======>>> fails at this point, no copied output is seen.
input.Seek(i, SoFromBeginning);
input.Write(BytetoWrite[0], Length(BytetoWrite)); =====>>> patches successfully
input.Free;
ShowMessage('Patch Success');
Exit;
end;
end;
if Assigned(input) then
begin
input.Free;
end;
ShowMessage('Patch Failed');
end;
旁註:它複製的罰款,如果我試圖複製之前關閉文件流。順便說一下,我已經在Delphi 7和XE7上測試過了。 謝謝
感謝您的回覆。 你能解釋一下更多的例子還是這兩個例子,特別是第二個例子。 異常處理執行不當。 生命週期管理鬆動。你可以很容易地泄漏。 – 2014-12-27 18:08:22
你不應該捕捉任何例外。讓更高層的呼叫堆做到這一點。用try/finally保護對象。這已經很好地覆蓋了。我的最高投票答案之一是全面的報道。 – 2014-12-27 18:11:12
這些其他奇怪之一是'如果分配(輸入)然後input.Free;'。這是分配的雙重檢查,因爲這是'TObject.Free'的主要工作:如果分配調用析構函數 – 2014-12-28 10:10:54