vs工程清理小工具

85 篇文章 4 订阅

通常我们在传输vs工程的时候,有很多不必要的文件可以清理,通常这些文件占用的空间可能还比较大,远超工程代码文件的大小,于是写了这个小工具,方便清理工程,支持多个过程同时清理,拖拽到界面上即可。

核心代码如下:

void CVsProjectCleanerDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	CString strItems;
	GetDlgItemText(IDC_EDIT_ITEM, strItems);
	if (strItems.GetLength() == 0)
	{
		strItems = CMfcStrFile::BrowseDir();
		if (strItems.GetLength() > 0)
		{
			 SetDlgItemText(IDC_EDIT_ITEM, strItems);
		}
		else
		{
			return;
		}
	}

	//开始逐个处理
	std::string sItems = CMfcStrFile::CString2string(strItems);
	std::vector<std::string> vDirs = CStdStr::Split(sItems, "|");

	size_t nDirNum = vDirs.size();
	for (size_t i = 0; i < nDirNum; ++i)
	{
		const std::string& sCurDir = CStdStr::AddSlashIfNeeded(vDirs[i]);

		if (!CStdDir::IfAccessDir(sCurDir))
		{
			continue;
		}


		//1.首先检查根目录下是否存在.sln文件
		std::vector<std::string> vSlnFiles;
		if (getFiles(sCurDir, vSlnFiles, "*.sln") == 0)
		{
			continue;
		}

		//2.删除根目录下的所有指定类型的文件
		const std::vector<std::string>& vRootDirs = _conf.vRootDirNames;
		const size_t nRootNum = vRootDirs.size();
		for (size_t j = 0; j < nRootNum; ++j)
		{
			const std::string sCurDirSub = sCurDir + vRootDirs[j];
			//防止配置文件配置错误误删
			if (CStdDir::IfAccessDir(sCurDirSub) && sCurDirSub != sCurDir)
			{
				deleteDir(sCurDirSub);
			}
		}

		//3.删除目录下所有指定的文件夹
		const std::vector<std::string>& vAllDirNames = _conf.vAllDirNames;
		std::vector<std::string> vAllDirs;
		getDirs(sCurDir, vAllDirs);
		const size_t nAllDirNum = vAllDirs.size();
		for (size_t j = 0; j < nAllDirNum; ++j)
		{
			const std::string sCurDirSub = vAllDirs[j];
			const std::string& strCurDirName = CStdStr::GetNameOfDir(sCurDirSub);
			if (CStdTpl::VectorContains(vAllDirNames, strCurDirName))
			{
				deleteDir(sCurDirSub);
			}
		}

		//4.删除目录下所有指定的后缀的文件
		const std::vector<std::string>& vAllSuffixs = _conf.vAllSuffixs;
		const size_t nAllSuffixsNum = vAllSuffixs.size();
		for (size_t j = 0; j < nAllSuffixsNum; ++j)
		{
			const std::string sCurSuffix = "*" + vAllSuffixs[j];
			std::vector<std::string> vFiles;
			getFiles(sCurDir, vFiles, sCurSuffix.c_str());
			const size_t& nFileNum = vFiles.size();
			for (size_t k = 0; k < nFileNum; ++k)
			{
				remove(vFiles[k].c_str());
			}
		}

		//5.删除目录下的所有空文件
		std::vector<std::string> vCheckBlankDirs, vFilesTmp;
		getDirs(sCurDir, vCheckBlankDirs);
		const size_t& nCheckBlankDirNum = vCheckBlankDirs.size();
		for (size_t j = 0; j < nCheckBlankDirNum; ++j)
		{
			const std::string& vCurDir = vCheckBlankDirs[j];
			vFilesTmp.clear();
			if (getFiles(vCurDir, vFilesTmp) == 0)
			{
				deleteDir(vCurDir);
			}
		}

	}

	WriteIniToFile(GetIniPath(), _conf);

	AfxMessageBox(IDS_PROCESS_OVER);

	CDialogEx::OnOK();
}

其中,子目录以及后缀的默认参数为:

typedef struct _config_s 
{
	std::vector<std::string> vRootDirNames;
	std::vector<std::string> vAllDirNames;
	std::vector<std::string> vAllSuffixs;

	_config_s()
	{
		//内部初始化
		memset(this, 0, sizeof(_config_s));

		vRootDirNames.push_back("ipch");
		vRootDirNames.push_back("x64");

		vAllDirNames.push_back("Debug");
		vAllDirNames.push_back("Release");

		vAllSuffixs.push_back(".aps");
		vAllSuffixs.push_back(".sdf");
		vAllSuffixs.push_back(".suo");
	}

}config_s;

欢迎交流与分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值