我正在处理一个小字节修补程序,但我遇到了一个错误。
在修改之前复制文件失败,没有错误,(没有看到复制的输出),但文件补丁成功。
这是补丁码
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上测试过它。 感谢答案 0 :(得分:3)
您无法复制该文件,因为您在为文件流打开文件时将其专门锁定,这就是CopyFile
失败的原因。
您应该在尝试拨打CopyFile
之前关闭该文件。这将需要您重新打开文件来修补它。或者可能使用不同的共享模式打开文件。
其他一些评论:
try/finally
。 0
到Length(arr)-1
,包括low()
。或者使用high()
和CopyFile
。 Win32Check
返回的值。通过调用Copy
来换行。 SetLength
函数返回一个新数组。所以你对Copy
进行了虚假的调用。要复制整个数组,请使用{{1}}的一个参数重载。 代码中还有许多其他奇怪的东西,我已经耗尽精力将它们全部指出。我想我得到了主要的。