在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;

sidenote:如果我在尝试复制之前关闭文件流,它将复制良好。

顺便说一下,我已经在Delphi 7和XE7上对其进行了测试。谢谢

大卫·赫弗南(David Heffernan)

您无法复制文件,因为在为文件流打开文件时已将其独占锁定,这就是CopyFile失败的原因

您应在尝试调用之前关闭文件CopyFile这将需要您重新打开文件以对其进行修补。或者,可以使用其他共享模式打开文件。

其他一些评论:

  • 异常处理的实现很差。不要在这里捕获异常。让他们浮上水面。
  • 终生管理不善。您可以轻松地泄漏它的状态。您需要了解try/finally
  • 您溢出缓冲区。对于一个动态数组的有效索引是0Length(arr)-1以下。或使用low()high()
  • 您无需检查所返回的值CopyFile呼叫来包装它Win32Check
  • Copy函数返回一个新数组。因此,您对进行了虚假呼叫SetLength要复制整个数组,请使用的一个参数重载Copy
  • 在此功能中显示消息可能是一个错误。最好让呼叫者提供用户反馈。

代码中还有很多其他奇怪的地方,我用尽了所有精力将它们全部指出。我想我有主要的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

复制文件时自制软件安装失败

复制文件时出错:尝试从资源文件夹中复制数据库时,InputStream似乎失败

Android打开失败:在数据/数据/包/文件中写入文件时EACCES(权限被拒绝)

在docker-compose文件中复制失败

复制打开的Excel文件

打开文件失败

当Dockerfile不在Docker Hub的根目录中时,“复制失败:未指定源文件”

在 pyfilesystem 的 s3 文件系统中打开文件失败

Android打开失败:尝试读取数据/数据中的文件时,EACCES(权限被拒绝)

映射目录时,sbt-native-packager失败,并显示“系统中打开的文件太多”

git在子模块中时找不到索引(“索引文件打开失败:不是目录”)

Azure DevOps-将文件复制到Blob存储时,AzureBlob文件复制任务失败

docker run在“ python3:无法打开文件”时失败

从库中复制文件时显示ProgressDialog

在Raku中复制文件时保留属性

在R中打开dicom文件时出错

在python中打开.mat文件时出错

在 Prolog 中打开文件时权限被拒绝

打开文件时lxml中的密码错误

操纵VBA中打开的文件时出错

在R中打开.nc文件时出错

打开文件时在vi中的光标位置

在搜索结果中单击时打开文件

复制时排除文件

在Windows中复制文件时如何保留文件属性?

如何确定“读取文件时出错打开”错误中的文件

在OMEdit中打开多个文件时关闭文件

在MATLAB中从文件列表打开文件时遇到问题

使用打开时作为文件以及打开中的for行