Inno Setup: elimina toda la carpeta de la aplicación, excepto el subdirectorio de datos
Por lo general, no tengo problemas para hacer una copia de seguridad de los juegos guardados, pero para este juego en particular, uso FreeArc, ya que el juego es muy grande, por lo que Inno Setup realmente no sabe qué archivos eliminar. Con FreeArc, necesitas usar
[UninstallDelete]
Type: files; Name: "{app}"
Pero este juego en particular almacena juegos guardados en{app}\data\save
. Necesito una función para mover esa carpeta a algún lugar, desinstalar el juego y luego volver a moverlo.
Aquí está mi código:
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;
Y aquí está el registro:
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.