在fmOpenReadWriteMode中打开时,复制文件失败

时间:2014-12-27 17:52:30

标签: delphi

我正在处理一个小字节修补程序,但我遇到了一个错误。

在修改之前复制文件失败,没有错误,(没有看到复制的输出),但文件补丁成功。

这是补丁码

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上测试过它。   感谢

1 个答案:

答案 0 :(得分:3)

您无法复制该文件,因为您在为文件流打开文件时将其专门锁定,这就是CopyFile失败的原因。

您应该在尝试拨打CopyFile之前关闭该文件。这将需要您重新打开文件来修补它。或者可能使用不同的共享模式打开文件。

其他一些评论:

  • 严重执行异常处理。不要在这里捕捉异常。让他们漂浮到高水平。
  • 终身管理是松散的。您可以轻松地泄漏。您需要了解try/finally
  • 你超越了缓冲区。动态数组的有效索引为0Length(arr)-1,包括low()。或者使用high()CopyFile
  • 您不会检查Win32Check返回的值。通过调用Copy来换行。
  • SetLength函数返回一个新数组。所以你对Copy进行了虚假的调用。要复制整个数组,请使用{{1}}的一个参数重载。
  • 在此功能中显示消息可能是一个错误。最好让呼叫者提供用户反馈。

代码中还有许多其他奇怪的东西,我已经耗尽精力将它们全部指出。我想我得到了主要的。