对于我的应用程序的安装和部署,我使用的是Inno-set5.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\
第二种方法有效吗?是否有更合理的方法来达到这个目的?
发布于 2015-08-20 10:46:04
文件被进程访问时不能被删除。找出导致这一切的原因。在开始删除文件夹之前,请退出即将删除的所有应用程序和服务。确保没有其他应用程序访问您要删除的文件(记事本、word等)。有时候,在结束其他进程之后再等待几秒钟就可以删除它们所使用的文件(也许其他人可以解释一下)。
有一次,我们找不到一个文件不能被卸载程序删除的原因。过了很长一段时间,我们发现正在运行的apachemonitor.exe正在访问一个日志文件,而且我们以前并没有终止这个进程。很难找到阻塞过程,但特别是当它总是同一个无法删除的文件时,您应该更好地查找安装和使用的进程,以便使一个正常工作的卸载程序正常工作。
如果您想删除文件夹中的所有文件,除了一个特殊文件,那么您应该在卸载程序中使用Pascal。函数引用(http://www.jrsoftware.org/ishelp/index.php?topic=scriptfunctions)在这里有很大帮助。
您可以使用FindFirst
、FindNext
、FindClose
对目录进行迭代。为要删除的所有项调用DelTree(DirName, true, true, true)
或DeleteFile
。
在CurUninstallStepChanged
事件(如果是CurUninstallStep=usPostUninstall
)内执行该代码。
发布于 2018-02-22 10:38:49
另一种防止在卸载时删除文件的方法是“使用参数标志”:
节文件中的
uninsneveruninstall;
来自帮助的信息:
从不卸载 永远不要删除文件。此标志在安装非常常见的共享文件时非常有用,在任何情况下都不应该删除这些文件,例如MFC DLL。
备注:如果此标志与sharedfile标志相结合,则在卸载时将永远不会删除该文件,但引用计数仍将适当减少。
https://stackoverflow.com/questions/32114880
复制相似问题