Inno Setup иногда не может изменить файл во время установки - PullRequest
0 голосов
/ 10 октября 2018

Во время установки Inno Setup я добавляю файлы в zip-архив, см. Здесь: Inno Setup Копирование файлов и папок в существующий Zip-файл .Я сразу после добавления файлов, архив переименовывается путем изменения расширения файла с .zip на .doc.

Код, используемый для переименования:

RenameFile(ExpandConstant('{app}\MyFile.zip'),  expandconstant('{app}\MyFile.doc'))  

Несмотря на то, что он хорошо работал в Windows 7 и 8, он стал менее надежным и только иногда работает в Windows 10.

Обратите внимание, что я пробовал:

Ищете предложения по созданию надежного решения или советы по отладке.

[Редактировать: добавлены коды ... переименованы некоторые биты, чтобы было легче читать]

   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 для переименования архива, но я не смог выяснить это ...

1 Ответ

0 голосов
/ 11 октября 2018

Есть две проблемы:

  • .CopyHere вызов асинхронный.После того как вы позвоните, вы должны дождаться завершения архивирования.Хотя Sleep на самом деле нереально, это следует делать..CopyHere на самом деле не блокирует файл, поэтому не будет препятствовать переименованию, но вы можете переименовать неполный файл.
  • Что приводит к сбою переименования, так это ваш вызов objFSO.getFile(Archive), которыйблокирует файл, и вы никогда не разблокируете его.И вы на самом деле никогда не используете h.Поэтому удалите этот вызов.

Почему бы вам не переименовать файл перед архивированием?Это предотвратит все эти проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...