对于我的应用程序的安装和部署,我使用Inno-Setup 5.5.4。我目前的安装结构如下:
C:\MyApp
C:\MyApp\app.exe
C:\MyApp\FolderA
C:\MyApp\FolderA\InstalledFile.txt
C:\MyApp\FolderA\NewFile.txt
C:\MyApp\FolderB
C:\MyApp\FolderB\NewFile.txt
...
C:\MyApp\FolderZ
卸载应用程序后,我想删除应用程序可能创建的所有可能文件,但特定文件夹中的文件除外。 (即C:\MyApp\FolderA\NewFile.txt
)。
我的第一次尝试是在[UninstallDelete]部分为每个要清理的文件夹创建一个条目。如下所示:
[UninstallDelete]
Type: filesandordirs; Name: C:\MyApp\FolderB
Type: filesandordirs; Name: C:\MyApp\FolderC
...
Type: filesandordirs; Name: C:\MyApp\FolderZ
但是,我不喜欢这个解决方案,因为每次向应用程序添加新文件夹时都必须考虑修改安装程序。
第二种方法是仅在特定文件夹为空时将其删除,然后设置要删除的应用程序的根文件夹。如下所示:
[UninstallDelete]
Type: dirifempty; Name: C:\MyApp\FolderA
Type: filesandordirs; Name: C:\MyApp\
第二种方法有效吗?有没有更合理的方法来实现这一目标?
答案 0 :(得分:1)
当进程访问文件时,不能删除该文件。寻找导致它的原因。 在开始删除文件夹之前,退出即将删除的所有应用程序和服务。确保没有其他应用程序访问您要删除的文件(记事本,单词等)。有时候在结束其他进程之后等待几秒钟然后删除它们已被使用的文件(可能是其他人可以解释它)是很好的。
我曾经遇到过一个案例,我们无法找到卸载程序无法删除文件的原因。很长一段时间后,我们发现正在运行的apachemonitor.exe正在访问一个日志文件,我们之前没有杀过该进程。找到阻止过程可能非常困难,但尤其是当它始终是无法删除的同一文件时,您应该更好地查找您安装和使用的进程,以便制作正确的工作卸载程序。
如果要删除特殊文件夹中的所有文件,则应在卸载程序中使用Pascal-Script。 函数引用(http://www.jrsoftware.org/ishelp/index.php?topic=scriptfunctions)在这里有很多帮助。
您可以使用FindFirst
,FindNext
,FindClose
来遍历目录。对于您要删除的所有项目,请致电DelTree(DirName, true, true, true)
或DeleteFile
。
如果CurUninstallStepChanged
,请在CurUninstallStep=usPostUninstall
事件中执行该代码。
答案 1 :(得分:0)
如何防止在卸载时删除文件的另一种方法是
使用参数标志:
<文件] 部分中的
uninsneveruninstall;
来自帮助的信息:
uninsneveruninstall
永远不要删除该文件。安装时,此标志非常有用 在任何情况下都不应删除的常见共享文件, 例如MFC DLL。
注意:如果此标志与sharedfile标志组合在一起,则在卸载时永远不会删除该文件,但引用计数仍将正确递减。