Inno setup Inno Setup-删除除数据子目录之外的整个应用程序文件夹

Inno setup Inno Setup-删除除数据子目录之外的整个应用程序文件夹,inno-setup,pascalscript,Inno Setup,Pascalscript,备份savegames通常没有问题,但是对于这个特定的游戏,我使用FreeArc,因为游戏非常大,所以Inno安装程序不知道要删除哪些文件。对于FreeArc,您需要使用 [UninstallDelete] Type: files; Name: "{app}" 但是这个特定的游戏将savegames存储在{app}\data\save中。我需要一个功能来移动文件夹的某个地方,卸载游戏,然后把它移回来 这是我的密码: 过程目录副本(SourcePath,DestPath:string); 变量

备份savegames通常没有问题,但是对于这个特定的游戏,我使用FreeArc,因为游戏非常大,所以Inno安装程序不知道要删除哪些文件。对于FreeArc,您需要使用

[UninstallDelete]
Type: files; Name: "{app}"
但是这个特定的游戏将savegames存储在
{app}\data\save
中。我需要一个功能来移动文件夹的某个地方,卸载游戏,然后把它移回来

这是我的密码:

过程目录副本(SourcePath,DestPath:string);
变量
FindRec:TFindRec;
SourceFilePath:string;
DestFilePath:string;
开始
如果FindFirst(SourcePath+'\*',FindRec),则
开始
尝试
重复
如果(FindRec.Name'.'和(FindRec.Name'.'),则
开始
SourceFilePath:=SourcePath+'\'+FindRec.Name;
DestFilePath:=DestPath+'\'+FindRec.Name;
如果FindRec.Attributes和FILE_ATTRIBUTE_DIRECTORY=0,则
开始
如果FileCopy(SourceFilePath、DestFilePath、False),则
开始
日志(格式('已将%s复制到%s',[SourceFilePath,DestFilePath]);
结束
其他的
开始
日志(格式('未能将%s复制到%s',[SourceFilePath,DestFilePath]);
结束;
结束
其他的
开始
如果是CreateDir(DestFilePath),则
开始
日志(格式('Created%s',[DestFilePath]);
DirectoryCopy(SourceFilePath、DestFilePath);
结束
其他的
开始
日志(格式('未能创建%s',[DestFilePath]);
结束;
结束;
结束;
直到没有FindNext(FindRec);
最后
FindClose(FindRec);
结束;
结束
其他的
开始
日志(格式('未能列出%s',[SourcePath]);
结束;
结束;
过程CurUninstallStep已更改(CurUninstallStep:TUninstallStep);
开始
如果(CurUninstallStep=usUninstall)和
DirExists(ExpandConstant({app}\data\SAVE'))然后
开始
如果MsgBox('是否要删除所有保存的游戏?',
好吧,好吧
开始
DelTree(ExpandConstant({app}'),True,True,True);
结束
其他的
开始
目录副本(ExpandConstant({app}\data\SAVE')、ExpandConstant({app}\SAVE');
Deltree(ExpandConstant({app}\data'),True,True,True);
目录副本(ExpandConstant({app}\SAVE')、ExpandConstant({app}\data\SAVE');
结束
结束;
结束;
下面是日志:

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.

将保存的内容复制回来不是一种过分的做法吗

一旦您已经有了迭代目录树的代码,就可以迭代它来删除除“save”文件夹之外的文件

下面的代码执行所有删除工作(在任一模式下),因此您需要删除
[UninstallDelete]
部分

过程DelTreeExceptSavesDir(路径:字符串);
变量
FindRec:TFindRec;
FilePath:string;
开始
如果FindFirst(路径+'\*',FindRec),则
开始
尝试
重复
如果(FindRec.Name'.'和(FindRec.Name'.'),则
开始
FilePath:=Path+'\'+FindRec.Name;
如果FindRec.Attributes和FILE_ATTRIBUTE_DIRECTORY=0,则
开始
如果删除文件(文件路径),则
开始
日志(格式('Deleted file%s',[FilePath]);
结束
其他的
开始
日志(格式('未能删除文件%s',[FilePath]);
结束;
结束
其他的
开始
如果CompareText(FindRec.Name,'save')=0,则
开始
日志(格式('保留目录%s',[FilePath]);
结束
其他的
开始
DelTreeExceptSavesDir(文件路径);
如果是RemoveDir(文件路径),则
开始
日志(格式('已删除目录%s',[FilePath]);
结束
其他的
开始
日志(格式('未能删除目录%s',[FilePath]);
结束;
结束;
结束;
结束;
直到没有FindNext(FindRec);
最后
FindClose(FindRec);
结束;
结束
其他的
开始
日志(格式('未能列出%s',[Path]);
结束;
结束;
过程CurUninstallStep已更改(CurUninstallStep:TUninstallStep);
变量
保存路径:字符串;
AppPath:string;
开始
保存路径:=ExpandConstant(“{app}\data\SAVE”);
如果CurUninstallStep=usUninstall,则
开始
AppPath:=ExpandConstant(“{app}”)
如果(不存在(保存路径))或
(MsgBox('是否要删除所有保存的游戏?',
那么
开始
日志(格式('删除应用程序文件夹%s',[AppPath]);
DelTree(AppPath,True,True,True);
结束
其他的
开始
日志(格式('删除应用程序文件夹%s,保存除外',[AppPath]));
DelTreeExceptSavesDir(应用路径);
结束;
日志(“删除完成”);
结束
结束;

但是,在
[UninstallDelete]
部分列出要删除的目录不是更容易吗?文件夹不能太多

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