关于cab包卸载时将所有文件删除的方法

做wince或是mobile开发,最终的文件会打包成一个cab包,当别人卸载我们的软件然后进行重装后,我们是希望最好连程序生成的配置文件也一并删除,否则重新安装的话会使用到以前的配置文件,有时这是我们不愿看到并且必须要处理的。

本文介绍的方法是如何利用系统本身的机制,通过一个动态库setup.dll以实现在卸载时删除安装目录中所有文件的功能。

首先需要生成一个setup.dll,此动态库中应包含这样的函数

codeUNINSTALL_INIT
Uninstall_Init(
HWND hwndParent,
LPCTSTR pszInstallDir
)

用以在卸载时进行文件删除的工作。

另外还有一个函数,也是在卸载之后可调用的,但由于参数中并没有带上路径,因此暂时未用,函数原型如下:

codeUNINSTALL_EXIT
Uninstall_Exit(
HWND hwndParent
)

好,首先需要实现一个DeleteDir的函数,然后用Uninstall_Init调用DeleteDir即可。

代码如下:

BOOL DeleteDir(TCHAR * path)
{
	WIN32_FIND_DATA finddata;
	HANDLE hfind;
	TCHAR * pdir;

	pdir=new TCHAR[_tcslen(path)+5];
	_tcscpy(pdir,path);
	if(path[_tcslen(path)-1] != TCHAR('\\'))
		_tcscat(pdir, _T("\\*.*"));
	else
		_tcscat(pdir, _T("*.*"));

	hfind=FindFirstFile(pdir,&finddata);
	if(hfind==INVALID_HANDLE_VALUE)
		return FALSE;

	delete []pdir;
	do
	{
		pdir=new TCHAR[_tcslen(path)+_tcslen(finddata.cFileName)+2];
		_stprintf(pdir,_T("%s\\%s"),path,finddata.cFileName);
		if(_tcscmp(finddata.cFileName,_T(".")) == 0 || _tcscmp(finddata.cFileName,_T("..")) == 0 )
		{
			delete []pdir;
			continue;
		}

		if((finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)==0)
			DeleteFile(pdir);
		else
			DeleteDir(pdir);

		delete []pdir;
	}while(FindNextFile(hfind,&finddata));

	if(RemoveDirectory(path))
		return TRUE;
	else
		return FALSE;
}

codeUNINSTALL_INIT
Uninstall_Init(
    HWND        hwndParent,
    LPCTSTR     pszInstallDir
)
{
	UnregisterTodayItem(hwndParent, pszInstallDir);

	DeleteDir((TCHAR*)pszInstallDir);

	return codeUNINSTALL_INIT_CONTINUE;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值