通常我们在传输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;
欢迎交流与分享。