Inno setup Inno安装程序在安装过程中有时无法更改文件

Inno setup Inno安装程序在安装过程中有时无法更改文件,inno-setup,Inno Setup,在Inno安装过程中,我正在将文件添加到zip存档中,请参见此处:。我在添加文件后,立即通过将文件扩展名从.zip更改为.doc来重命名存档 用于重命名的代码为: RenameFile(ExpandConstant('{app}\MyFile.zip'), expandconstant('{app}\MyFile.doc')) 虽然它在Windows7和Windows8下工作得很好,但它的可靠性已经降低,有时只能在Windows10下工作 请注意,我尝试过的内容包括: 增加睡眠;但这不起

在Inno安装过程中,我正在将文件添加到zip存档中,请参见此处:。我在添加文件后,立即通过将文件扩展名从.zip更改为.doc来重命名存档

用于重命名的代码为:

RenameFile(ExpandConstant('{app}\MyFile.zip'),  expandconstant('{app}\MyFile.doc'))  
虽然它在Windows7和Windows8下工作得很好,但它的可靠性已经降低,有时只能在Windows10下工作

请注意,我尝试过的内容包括:

增加睡眠;但这不起作用。。。 根据接受的答案复制具有不同名称的文件: 寻找建议,以制定可靠的解决方案和/或调试技巧

[编辑:添加了代码…重命名了一些位以便于阅读]

   function SetFileAttributes(lpFileName : String; dwAttribs : LongInt) : Boolean;
   external 'SetFileAttributesA@kernel32.dll stdcall';


  procedure RepackZip();
  var
    ResultCode, i: Integer;
    x1, x2: string;
  begin
  // Find files 
    x1 := FindFile('xmlns="sl:SLA"');
    x2 := FindFile('xmlns="sl:SLB"');
      log(ExpandConstant('{app}'));

  // 2. Copy files to archive
    SetFileAttributes ((expandconstant('{app}\MyFile.zip')), 0);
    if not FileCopy(ExpandConstant('{tmp}\SLA.xml'), ExpandConstant('{app}\Temp\customXml\') + x1, False) then 
      MsgBox(x1 + 'failed!', mbError, MB_OK);
    if not FileCopy(ExpandConstant('{tmp}\SLB.xml'), ExpandConstant('{app}\Temp\customXml\') + x2, False) then 
      MsgBox(x2 + 'failed!', mbError, MB_OK);

    CopyToArchive();
         SetFileAttributes ((expandconstant('{app}\MyFile.zip')), 0);  
         sleep(100);
         // HAVE TRIED COPY & RENAME
         // Everything works up to here and both FileCopy and FileRename fail on the same computers (permissions?)  
         // Have told Inno to Require Admin, makes no difference.
         //RenameFile(ExpandConstant('{app}\MyFile.zip'),  expandconstant('{app}\MyFile.dotm')) 
         FileCopy(ExpandConstant('{app}\MyFile.zip'), ExpandConstant('{app}\MyFile.doc'), false); 
         For i := 0 to 5 do
         begin
            if not FileExists(ExpandConstant('{app}\MyFile.doc')) then
            begin
              sleep (250);
            end
            else begin
   //           SetFileAttributes ((expandconstant('{app}\MyFile.doc')), 1);
              exit;
            end;
         end;

         if not FileExists(expandconstant('{app}\MyFile.doc')) then
          MsgBox('Failed - rename archive to .doc', mbError, MB_OK);
  end;
和CopyToArchive这是有效的-但我想知道CopyToArchive是否会以某种方式保持存档打开并阻止重命名:

procedure CopyToArchive(); //(const Archive, Content: string);
var
  Shell: Variant;
  Folder: Variant;
  Archive, Content: string;
  objFSO, h: Variant;
  max0, max1: integer;
begin
  Shell := CreateOleObject('Shell.Application');
  Archive := ExpandConstant('{app}') + '\MyFile.zip';
  Folder := Shell.NameSpace(Archive);
  log('Archive Location: ' + Archive);
  objFSO := CreateOleObject('Scripting.FileSystemObject');
  h := objFSO.getFile(Archive);
  Content := ExpandConstant('{app}\Temp\customXml\');
  Folder.CopyHere(Content, $0100);
  sleep(2000);

end;

我开始研究的一件事是使用objFSO重命名存档,但我无法解决它…

有两个问题:

.CopyHere调用是异步的。调用后,您必须等待归档完成。虽然睡眠不是真的可以实现,但它应该可以实现。CopyHere实际上不会锁定文件,因此不会阻止重命名,但您可能会重命名一个不完整的文件。 导致重命名失败的原因是调用objFSO.getFileArchive,它会锁定文件,而您永远不会解锁它。实际上你从来没有用过h。所以,取消那个电话。
为什么不在存档之前重命名文件?它可以防止所有这些问题。

谢谢大家,不管怎样,只要有兴趣,我都会看一看,WiX:MS使用他们自己来编写SQL安装程序…所以我安装了WiX和。。。如果我点击WiX工具集,它只会带我回到它来自的网站。。。出口搜索WiX,打开桌面应用,嗯?所以让我直说吧。。。这是一个安装程序,它甚至不能自行安装??安装WiX时从来没有遇到过问题。安装后,您可以通过创建WiX项目,使用Visual Studio编写安装程序。哦。。。我实际上并没有使用VS,我是在MS Office内部的VBA中。。。所以如果我打开VS…,谢谢,我会做一些测试,然后报告。我想我试过用h注释掉,但是没有用,我可能会让睡眠时间长得可笑…注释掉h并添加一个愚蠢的大延迟20sec,现在起作用了。。。我看看我能耽搁多久。