vs工程清理小工具

通常我們在傳輸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;

歡迎交流與分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章