为什么程序卸载后不能删除干净?

linxking 发布于 2014年02月09日
无人欣赏。

这个问题一直是最大的迷,windows时代,探索过注册表什么的,看了一点电脑书刊后,还是不能理解,只能接受这个事实,之前因为有这方面的洁癖,安了个什么,然后发现某个路径下还有目录,虽然是空的,但发现有好多。就烦了,干脆就重装系统。这事后来有了“超级兔子”“鲁大师”可以清理。但疑问,问什么程序设计的时候就不能把这些清理的活都干了吗?

共6条回复
sycx 回复于 2014年02月09日

因为懒....

tinyfool 回复于 2014年02月09日

1楼 @sycx 你还真是有体会

akunamotata 回复于 2014年02月09日

不影响你使用啊,说到底还是。。。懒。。。

wangcash 回复于 2014年02月09日

感觉应该是这样的:

开发某个功能的程序员A:我需要保存一组数据,写文件什么的路径判断什么的麻烦,写注册表里面吧~

开发某几个功能的程序员B:有个数据要传到另个一功能里,写接口把麻烦,写注册表里面吧~

架构师C:程序要读一些配置信息,配置文件被误修改(误删除)了怎么办?写注册表里面吧~

...

写卸载程序的程序员Z:看下文件列表,写个程序删除,完工~

更多情况下,软件公司根本没有程序员Z......

linxking 回复于 2014年02月09日

噢,我以为,是电脑这个硬件结构体系本身的原因,不能清理干净是不可逆事件,原来是可以做到的清理干净的!

perotsu 回复于 2014年02月10日

可以清除干净,不过这个貌似与程序设计关系不大,是与打包程序脚本相关

例如在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来讲就不要加了. 软件测试里可以叫卸载测试,打包脚本写好了搞干净是完全没问题的.

登录 或者 注册
相关帖子