VS清理器
界面
工程目录
列表控件ID改名IDC_FILELIST 绑定变量m_FileList
属性设置Accept Files 设置True
成员添加
// 用于保存待遍历的目录 vector<CString> m_DirVec; // 保存待删除的文件 vector<CString> m_WaitVec; // 保存可删除的文件个数 DWORD m_DelCount = 0; // 保存所有文件的个数 DWORD m_FileCount = 0; // 用于保存总文件的大小 ULONGLONG m_CountSize = 0; // 用于保存可删除的大小 ULONGLONG m_DelSize = 0;
WM_DROPFILES响应拖拽控件信息
// 响应文件的拖拽消息 void CVSClearDlg::OnDropFiles(HDROP hDropInfo) { // 1. 获取到拖拽的所有文件和文件夹的的个数 int count = DragQueryFile(hDropInfo, -1, nullptr, 0); // 2. 通过获取到的文件个数进行循环获取文件名 for (int i = 0; i < count; ++i) { // 2.1 申请空间用于保存文件的名称 WCHAR FileName[MAX_PATH] = { 0 }; // 2.2 根据循环获取的下标获取文件的名称 DragQueryFile(hDropInfo, i, FileName, MAX_PATH); // 2.3 判断当前的项是不是一个目录 if (GetFileAttributes(FileName) & FILE_ATTRIBUTE_DIRECTORY) { // 2.4 查看路径是否已经存在与容器中 if (m_DirVec.end() == find(m_DirVec.begin(), m_DirVec.end(), FileName)) { // 2.5 添加到目录容器中,用于将来遍历 m_DirVec.push_back(FileName); // 2.6 添加到列表中,用于进行显示 m_FileList.InsertItem(i, FileName); } } } CDialogEx::OnDropFiles(hDropInfo); }
待删文件
按钮处理事件
// 这个按键用于获取所有可以删除的文件放置到待删除列表中 void CVSClearDlg::OnBnClickedButton3() { // 检查是否需有需要遍历的目录 if (m_FileList.GetItemCount() == 0) { MessageBox(L"没有更多可遍历的目录!"); return; } // 遍历路径容器,调用函数删除所有符合的文件 for (auto& Path : m_DirVec) { // 寻找需要删除的文件 FindFile(Path); } // 当前遍历了多少文件和可以删除多少 CString Msg; Msg.Format(L"共有文件 %d 个,大小为 %.2lf MB 可以删除 %d 个,大小为 %.2lf MB", m_FileCount, m_CountSize / 1024.0 / 1024.0, m_DelCount, m_DelSize / 1024.0 / 1024.0); MessageBox(Msg); } // 遍历文件, 寻找需要删除的文件 VOID CVSClearDlg::FindFile(CString FilePath) { // 0. 定义需要的结构体 WIN32_FIND_DATA FindInfo = { 0 }; // 1. 拼接需要寻找的字符串路径 HANDLE FindHandle = FindFirstFile(FilePath + L"\*", &FindInfo); // 2. 判断句柄是否获取成功 if (FindHandle != INVALID_HANDLE_VALUE) { // 3. 使用 do while 不断的获取所有的内容 do { // 4. 如果是目录就继续遍历 if (FindInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 4.1 过滤掉 . 和 .. 路径 if (CString(".") == FindInfo.cFileName || CString("..") == FindInfo.cFileName) continue; // 4.2 拼接出新的路径,继续递归遍历 FindFile(FilePath + L"\" + FindInfo.cFileName); } // 5. 处理文件类型的项 else { // 文件的总数 +1,大小也增加 m_FileCount++; m_CountSize += FindInfo.nFileSizeLow; // 5.1 否则判断是否是需要删除的文件 if (-1 != m_FileExt.Find(PathFindExtension(FindInfo.cFileName))) { // 要删除的文件个数 + 1 m_DelCount++; m_DelSize += FindInfo.nFileSizeLow; // 拼接出全路径 CString FileName = FilePath + L"\" + FindInfo.cFileName; // 5.2 将符合条件的文件单独添加到容器中 m_WaitVec.push_back(FileName); // 5.3 将文件路径添加到列表中 m_WaitList.InsertItem(0, FileName); } } } while (FindNextFile(FindHandle, &FindInfo)); } }
删除按钮处理事件
// 删除遍历到的符合要求的文件 void CVSClearDlg::OnBnClickedButton1() { // 检查是否需要删除文件 if (m_WaitList.GetItemCount() == 0) { MessageBox(L"没有更多可删除的文件!"); return; } int FileCount = 0; // 遍历文件进行删除 for (auto& FilePath : m_WaitVec) { if (DeleteFile(FilePath)) { // 递增文件和大小 FileCount++; // 删除成功,添加到列表 m_DelList.InsertItem(0, FilePath); } } // 可以删除的个数和实际删除的个数 CString Msg; Msg.Format(L"可删除文件 %d 个 实际删除删除文件 %d 个", m_DelCount, FileCount); MessageBox(Msg); }
后缀名的更新按钮事件
// 更新可删除的文件后缀名 void CVSClearDlg::OnBnClickedButton2() { // 从控件获取信息到变量 UpdateData(TRUE); }
知识点
后缀名的类型设置直接在构造函数中初始化了信息
CVSClearDlg::CVSClearDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_VSCLEAR_DIALOG, pParent) { m_FileExt = _T(".obj\.tlog\.lastbuildstate\.idb\.pdb\.pch\.res\.ilk\.exe\.sdf\.ipch\.log\.db\.suo\"); m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
WM_DROPFILES响应拖拽控件信息
类向导-选择想要响应的类-命令-WM_DROFILES
解除管理员模式下的消息过滤
ChangeWindowMessageFilterEx(m_hWnd, WM_DROPFILES, MSGFLT_ALLOW, NULL);
ChangeWindowMessageFilterEx(m_hWnd, 0x0049, MSGFLT_ALLOW, NULL);
根据循环获取的下标获取文件的名称
DragQueryFile(hDropInfo, i, FileName, MAX_PATH);
判断当前的项是不是一个目录
if (GetFileAttributes(FileName) & FILE_ATTRIBUTE_DIRECTORY)
遍历路径容器,调用函数删除所有符合的文件
for (auto& Path : m_DirVec)
{
// 寻找需要删除的文件
FindFile(Path);
}
CString里Format的用法
CString Msg;
Msg.Format(L"共有文件 %d 个,大小为 %.2lf MB
可以删除 %d 个,大小为 %.2lf MB",
m_FileCount, m_CountSize / 1024.0 / 1024.0,
m_DelCount, m_DelSize / 1024.0 / 1024.0);
MessageBox(Msg);
拼接需要寻找的字符串路径
// 0. 定义需要的结构体
WIN32_FIND_DATA FindInfo = { 0 };
HANDLE FindHandle = FindFirstFile(FilePath + L"\*", &FindInfo);
#####
PathFindExtension()查找后缀名函数
//否则判断是否是需要删除的文件
if (-1 != m_FileExt.Find(PathFindExtension(FindInfo.cFileName)))