2016-04-08 17 views
1

Ich habe normalerweise keine Probleme beim Sichern von Savegames, aber für dieses spezielle Spiel verwende ich FreeArc, da das Spiel sehr groß ist, so dass Inno Setup nicht wirklich weiß, welche Dateien löschen. Mit FreeArc, müssen SieInno Setup - Lösche ganze Anwendung Ordner mit Ausnahme von Daten Unterverzeichnis

[UninstallDelete] 
Type: files; Name: "{app}" 

aber dieses Spiel speichert Spielstände in {app}\data\save verwenden. Ich brauche eine Funktion, um diesen Ordner irgendwo zu verschieben, das Spiel zu deinstallieren und es dann zurück zu bewegen.

Hier ist mein Code:

procedure DirectoryCopy(SourcePath, DestPath: string); 
var 
    FindRec: TFindRec; 
    SourceFilePath: string; 
    DestFilePath: string; 
begin 
    if FindFirst(SourcePath + '\*', FindRec) then 
    begin 
    try 
     repeat 
     if (FindRec.Name <> '.') and (FindRec.Name <> '..') then 
     begin 
      SourceFilePath := SourcePath + '\' + FindRec.Name; 
      DestFilePath := DestPath + '\' + FindRec.Name; 
      if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then 
      begin 
      if FileCopy(SourceFilePath, DestFilePath, False) then 
      begin 
       Log(Format('Copied %s to %s', [SourceFilePath, DestFilePath])); 
      end 
       else 
      begin 
       Log(Format('Failed to copy %s to %s', [SourceFilePath, DestFilePath])); 
      end; 
      end 
      else 
      begin 
      if CreateDir(DestFilePath) then 
      begin 
       Log(Format('Created %s', [DestFilePath])); 
       DirectoryCopy(SourceFilePath, DestFilePath); 
      end 
       else 
      begin 
       Log(Format('Failed to create %s', [DestFilePath])); 
      end; 
      end; 
     end; 
     until not FindNext(FindRec); 
    finally 
     FindClose(FindRec); 
    end; 
    end 
    else 
    begin 
    Log(Format('Failed to list %s', [SourcePath])); 
    end; 
end; 

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 
Begin 
    if (CurUninstallStep = usUninstall) and DirExists(ExpandConstant('{app}\data\SAVE')) then 
    begin 
    if MsgBox('Do you want to delete all save games?', mbConfirmation, MB_YESNO) = IDYES then 
     begin 
     DelTree(ExpandConstant('{app}'), True, True, True); 
     end 
    else 
     begin 
     DirectoryCopy(ExpandConstant('{app}\data\SAVE'), ExpandConstant('{app}\SAVE')); 
     Deltree(ExpandConstant('{app}\data'), True, True, True); 
     DirectoryCopy(ExpandConstant('{app}\SAVE'), ExpandConstant('{app}\data\SAVE')); 
     end 
    end; 
End; 

Und hier ist das Protokoll:

2016-04-08 10:16:02.420 Log opened. (Time zone: UTC+04:00) 
2016-04-08 10:16:02.421 Setup version: Inno Setup version 5.5.6 (u) 
2016-04-08 10:16:02.421 Original Uninstall EXE: C:\Games\MyApp\unins001.exe 
2016-04-08 10:16:02.421 Uninstall DAT: C:\Games\MyApp\unins001.dat 
2016-04-08 10:16:02.421 Uninstall command line: /SECONDPHASE="C:\Games\MyApp\unins001.exe" /FIRSTPHASEWND=$B5111C /log=C:\setup.log 
2016-04-08 10:16:02.421 Windows version: 6.1.7601 SP1 (NT platform: Yes) 
2016-04-08 10:16:02.421 64-bit Windows: Yes 
2016-04-08 10:16:02.421 Processor architecture: x64 
2016-04-08 10:16:02.421 User privileges: Administrative 
2016-04-08 10:16:02.421 64-bit install mode: No 
2016-04-08 10:16:02.422 Created temporary directory: C:\Users\George\AppData\Local\Temp\is-GSI4R.tmp 
2016-04-08 10:16:02.440 Message box (Yes/No): 
          Are you sure you want to completely remove MyApp and all of its components? 
2016-04-08 10:16:04.014 User chose Yes. 
2016-04-08 10:16:04.031 Message box (Yes/No): 
          Do you want to delete all save games? 
2016-04-08 10:16:04.790 User chose No. 
2016-04-08 10:16:04.791 Failed to create C:\Games\MyApp\SAVE\scores 
2016-04-08 10:16:04.805 Failed to list C:\Games\MyApp\SAVE 
2016-04-08 10:16:04.805 Starting the uninstallation process. 
2016-04-08 10:16:04.806 Deleting Uninstall data files. 
2016-04-08 10:16:05.326 Uninstallation process succeeded. 
2016-04-08 10:16:05.326 Removed all? Yes 
2016-04-08 10:16:05.326 Need to restart Windows? No 
2016-04-08 10:16:05.814 Message box (OK): 
          MyApp was successfully removed from your computer. 
2016-04-08 10:16:06.678 User chose OK. 
2016-04-08 10:16:06.679 Log closed. 
+0

* "hat nicht wirklich funktioniert, wie ich es erwartet hatte" * - Bedeutet was? Zeig uns deinen Code. Zeigen Sie uns die Protokolldatei. Erklären Sie, was falsch gelaufen ist. –

+0

Der Ordner '{app}' wurde noch gelöscht. Hier gehts zu meinen noob qestions: wie logge ich mich? –

+0

'setup.exe/log = setup.log' + Zeigen Sie uns Ihren Code. –

Antwort

1

Ist es nicht zuviel des Guten das spart weg zu kopieren und dann zurück?

Sobald Sie bereits einen Code zum Iterieren eines Verzeichnisbaums haben, iterieren Sie ihn, um die Dateien zu löschen, mit Ausnahme des Ordners "save".

Der unten stehende Code löscht alle Löschvorgänge (in beiden Modi), daher müssen Sie den Abschnitt [UninstallDelete] entfernen.

procedure DelTreeExceptSavesDir(Path: string); 
var 
    FindRec: TFindRec; 
    FilePath: string; 
begin 
    if FindFirst(Path + '\*', FindRec) then 
    begin 
    try 
     repeat 
     if (FindRec.Name <> '.') and (FindRec.Name <> '..') then 
     begin 
      FilePath := Path + '\' + FindRec.Name; 
      if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then 
      begin 
      if DeleteFile(FilePath) then 
      begin 
       Log(Format('Deleted file %s', [FilePath])); 
      end 
       else 
      begin 
       Log(Format('Failed to delete file %s', [FilePath])); 
      end; 
      end 
      else 
      begin 
      if CompareText(FindRec.Name, 'save') = 0 then 
      begin 
       Log(Format('Keeping directory %s', [FilePath])); 
      end 
       else 
      begin 
       DelTreeExceptSavesDir(FilePath); 

       if RemoveDir(FilePath) then 
       begin 
       Log(Format('Deleted directory %s', [FilePath])); 
       end 
       else 
       begin 
       Log(Format('Failed to delete directory %s', [FilePath])); 
       end; 
      end; 
      end; 
     end; 
     until not FindNext(FindRec); 
    finally 
     FindClose(FindRec); 
    end; 
    end 
    else 
    begin 
    Log(Format('Failed to list %s', [Path])); 
    end; 
end; 

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 
var 
    SavePath: string; 
    AppPath: string; 
begin 
    SavePath := ExpandConstant('{app}\data\SAVE'); 

    if CurUninstallStep = usUninstall then 
    begin 
    AppPath := ExpandConstant('{app}') 

    if (not DirExists(SavePath)) or 
     (MsgBox('Do you want to delete all save games?', mbConfirmation, MB_YESNO) = IDYES) then 
    begin 
     Log(Format('Deleting application folder %s', [AppPath])); 
     DelTree(AppPath, True, True, True); 
    end 
     else 
    begin 
     Log(Format('Deleting application folder %s except saves', [AppPath])); 
     DelTreeExceptSavesDir(AppPath); 
    end; 
    Log('Delete done'); 
    end 
end; 

Obwohl, wäre es nicht einfacher, Verzeichnisse aufzulisten im [UninstallDelete] Abschnitt löschen? Es kann nicht so viele Ordner geben.

[UninstallDelete] 
Type: files; Name: "{app}\*" 
Type: filesandordirs; Name: "{app}\data\data1" 
Type: filesandordirs; Name: "{app}\data\data2" 
Type: filesandordirs; Name: "{app}\anotherfolder" 
+0

Ja, zunächst suchte ich nach einem Code, der alle Unterordner bis auf einen löschte, aber keinen fand, also musste ich nach Workarounds suchen. Auch, nein, hat nicht wieder funktioniert, aktualisiert das Protokoll. –

+0

siehe meine aktualisierte Antwort ('CompareText' Funktion, um den" save "Ordner zu überspringen + alternative Implementierung mit' UninstallDelete') –

+0

Dort sind eigentlich viele Ordner. Einige von ihnen werden während des Spiels generiert. Der neue Code funktioniert. Danke vielmals. –