这个问题一直是最大的迷,windows时代,探索过注册表什么的,看了一点电脑书刊后,还是不能理解,只能接受这个事实,之前因为有这方面的洁癖,安了个什么,然后发现某个路径下还有目录,虽然是空的,但发现有好多。就烦了,干脆就重装系统。这事后来有了“超级兔子”“鲁大师”可以清理。但疑问,问什么程序设计的时候就不能把这些清理的活都干了吗?
感觉应该是这样的:
开发某个功能的程序员A:我需要保存一组数据,写文件什么的路径判断什么的麻烦,写注册表里面吧~
开发某几个功能的程序员B:有个数据要传到另个一功能里,写接口把麻烦,写注册表里面吧~
架构师C:程序要读一些配置信息,配置文件被误修改(误删除)了怎么办?写注册表里面吧~
...
写卸载程序的程序员Z:看下文件列表,写个程序删除,完工~
更多情况下,软件公司根本没有程序员Z......
可以清除干净,不过这个貌似与程序设计关系不大,是与打包程序脚本相关
例如在windows下常用 InnoSetup 或者 NSIS 来制作安装包. 简单一点说打包脚本分为安装包生成和卸载两部分,
那么最终程序安装后会包括:
(1)写注册表/release版本程序目录(即按目录结构来载入exe/库/资源等)
(2)另外程序运行后会生成的文件(包括用户数据或者一些下载的等)
卸载部分大概类似下面这种语法:
Delete "$INSTDIR\Bin\cocoa.exe" #删文件
Delete "$INSTDIR\uninst.exe"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" #删注册表
RMDir "$INSTDIR" #删除目录,如果非空则删除失败
RMDir /r "$INSTDIR" #递归删除
那么无法删除干净的原因也就出来了:
(1)卸载脚本中没有完全指定程序所有的文件(指定所有文件名脚本会很长很长)或目录
(2)删除目录时未指写/r参数,目录可能删除失败
PS:
值得注意的地方是如果用户将安装目录直接丢在C盘, /r肯定会出事的.所以只对确定的程序子目录用/r,对最上一层$INSTDIR来讲就不要加了. 软件测试里可以叫卸载测试,打包脚本写好了搞干净是完全没问题的.