用过InstallShield做安装包的朋友都有这么一个问题,当程序在卸载的时候,没有将程序安装时创建的文件夹给彻底删除,这个时候当我们再一次安装这个程序的时候如果选择的安装目录是同一个,那么很有可能会出现安装好的程序不能启动或者出现一些意想不到的问题。
最近我们项目组的安装包是由我负责的,在程序卸载的时候也出现了这样问题,当卸载以后需要将程序安装目录手动删除,才能保证第二次安装的时候不会出现问题。
程序在安装的时候会要求用户创建一个目录如:d:\hiadmin
然后程序会在d:\hiadmin里面写如3个文件夹diskserver,xml以及server这样的3个文件夹,diskserver是主程序文件,xml是用户在使用过程中产生的文件,server里面是用来管理diskserver程序的也就是说开机后先启动server进程,然后server进程调用diskserver进程,这样能保证当diskserver进程被结束后能由server来再次启动。
d:\hiadmin\diskerver 主程序文件
d:\hiadmin\xml 使用过程产生的文件放这里
d:\hiadmin\server 管理程序
现在在卸载过程有2个问题
1.安装程完成后如果运行过程序那么就会产生一个log,和配置文件。而这个时候如果进行卸载操作,新生成的文件时不会被删除的
2.当程序还在运行过程中如果执行卸载操作的话,正在运行的exe文件也是不能删除,包括了exe所调用dll以及一些资源
为了解决以上卸载的问题InstallShield提供了DeleteDir函数
下面是InstallShield帮助文档里面的说明
DeleteDir( szDir, nFlag );
szDir Specifies the fully qualified name of the directory to delete.
nFlag
Specifies deletion options. Pass one of the following predefined constants in this parameter:
- ALLCONTENTS—Deletes the directory in szDir, including all subdirectories and files beneath it. The directory you are deleting must be a subdirectory and cannot be a root directory of the drive.
- ONLYDIR—Deletes the directory in szDir only if it is empty. Otherwise, the function fails.
- ROOT—Deletes the directory in szDir even if it is the root directory. If szDir is a root directory, DeleteDir will delete everything on the disk.
语法:DeleteDir(szDir, nFlag);
说明:DeleteDir函数删除一个子目录。根据你在参数nFlag使用的值,你可以仅当子目录为空时删除它,即使子目录包含文件也删除它,或删除整个根目录。设置nFlag需特别谨慎。
参数:
szDir
指定要被删除的目录的全限定名。
nFlag
指定删除选项。在该参数位置传递下列预定义常量之一:
ALLCONTENTS:删除szDir 指定的目录,包括其下的所有子目录和文件。你删除的目录必须是一个子目录,不能是驱动器上的一个根目录。
ONLYDIR:仅当szDir指定的目录为空时才删除它。否则函数失败。
ROOT:即使szDir指定的目录是根目录也要删除它。如果szDir是一个根目录,DeleteDir将删除磁盘上一切东西
下面是我在执行卸载时候的代码
function OnUninstalledFile(szFile)
//卸载时候的函数
begin
ServiceStopService(“hiadmin”);
//为了解决程序还在运行的时候不能完全删除文件夹所以我先停止了服务
DeleteDir (TARGETDIR^”hiadmin”,ALLCONTENTS);
//删除TARGETDIR(安装目录下)的整个hiadmin文件夹
end;
这样也就将hiadmin下面的diskserver,xml和server都删除了。到此就不用担心程序在卸载的时候文件没有删除干净导致再次安装的出现一些莫名其妙的问题。
为了这3句代码写了这么多,希望不会有朋友拍砖………
希望和使用InstallShield的朋友一起探讨。
OnUninstalledFile该函数是在每次删除一个文件的时候就调用.在该问题中调用不适合.应该在Advanced的OnUninstall函数中做该事情
@coconut
先选中Move Data 然后再后面的下拉菜单里面选择OnUninstalledFile即可
能否说详细点这个函数在哪加的啊,哪有move data啊
在写代码的地方了。可以找到“Move Data”
InstallScript上新建一个么 我选中Move Data,但是后面的选择框中只有Moved和Moving
两个选项哦,而且这个写好了还要建议哦Customer Action来关联,然后再把Action insert到
Sequences中去吧,Customer Action的属性应该怎么选择,又应该insert到哪个Sequences
后面呢
还有我测试了一下,随便写了个InstallScript保存后退出,再打开怎么没有了。。。
纠结中,望指教哦
OnUninstalledFile
后面添加的函数都是在卸载的时候才会调用的
您新建一个工程然后切换到代码页面,上面选择Move Data下面的下拉里面在选择后
卸载代码就会出现代码页面中的
请问你写的这个OnUninstalledFile函数,在那里被调用?