Inno Setup:安装删除部分之前备份外部文件

时间:2017-03-09 09:49:22

标签: backup inno-setup

我会在[InstallDelete]部分删除文件和文件夹之前对其进行备份

[Files]
Source: "{app}\res_mods\configs\wotstat\cache.json"; \
  DestDir: "{app}\_backup\res_mods_{#DateTime}\configs\wotstat\"; \
  Flags: external skipifsourcedoesntexist uninsneveruninstall 
Source: "{app}\res_mods\0.9.17.1\vehicles\*"; \
  DestDir:"{app}\_backup\res_mods_{#DateTime}\0.9.17.1\vehicles\"; \
  Flags: external skipifsourcedoesntexist createallsubdirs recursesubdirs uninsneveruninstall

这很好用。但是,如果我检查

[InstallDelete]
Type: filesandordirs; Name: "{app}\mods\*.*"; Tasks: cleanres
Type: filesandordirs; Name: "{app}\res_mods\*.*"; Tasks: cleanres

没有保存文件

我如何才能使它发挥作用。 THX

1 个答案:

答案 0 :(得分:1)

[InstallDelete]部分之前处理[Files]部分(正如人们所期望的那样)。请参阅installation order

您可以在安装开始之前的CurStepChanged(ssInstall) event中对备份进行编码:

[Code]

procedure CurStepChanged(CurStep: TSetupStep);
var
  SourcePath: string;
  DestPath: string;
begin
  if CurStep = ssInstall then
  begin
    SourcePath := ExpandConstant('{app}\res_mods\0.9.17.1\vehicles');
    DestPath := ExpandConstant('{app}\_backup\res_mods_{#DateTime}\0.9.17.1\vehicles');
    Log(Format('Backing up %s to %s before installation', [SourcePath, DestPath]));
    if not ForceDirectories(DestPath) then
    begin
      Log(Format('Failed to create %s', [DestPath]));
    end
      else
    begin
      DirectoryCopy(SourcePath, DestPath);
    end;

    SourcePath := ExpandConstant('{app}\res_mods\configs\wotstat\cache.json');
    DestPath := ExpandConstant('{app}\_backup\res_mods_{#DateTime}\configs\wotstat');
    if not ForceDirectories(DestPath) then
    begin
      Log(Format('Failed to create %s', [DestPath]));
    end
      else
    begin
      if not FileCopy(SourcePath, DestPath + '\cache.json', False) then
      begin
        Log(Format('Failed to copy %s', [SourcePath]));
      end
        else 
      begin
        Log(Format('Backed up %s', [SourcePath]));
      end;
    end;
  end;
end;

该代码使用Inno Setup: copy folder, subfolders and files recursively in Code section中的DirectoryCopy函数。