開發一個基於 MFC 對話框的文件清理工具,支持指定目錄掃描、文件列表展示、按條件篩選(擴展名、大小、修改時間)、勾選刪除、日志記錄等功能。
CEdit + CButton (調用 SHBrowseForFolder)CComboBox (擴展名)、CSpinButtonCtrl (大小/天數)CListCtrl (Report 模式,勾選框列、名稱、大小、路徑、修改時間)CProgressCtrl + CListBox 或 CEdit (多行)void CFileCleanerDlg::ScanFiles(const CString& strRootPath)
{
CFileFind finder;
CString strSearch = strRootPath + _T("\\*.*");
BOOL bWorking = finder.FindFile(strSearch);
while (bWorking)
{
bWorking = finder.FindNextFile();
if (finder.IsDots()) continue;
if (finder.IsDirectory())
{
// 遞歸掃描子目錄
ScanFiles(finder.GetFilePath());
}
else
{
// 文件篩選邏輯
if (MatchFilter(finder))
{
AddFileToList(finder);
}
}
}
finder.Close();
}
bool CFileCleanerDlg::MatchFilter(const CFileFind& finder)
{
// 擴展名過濾
CString strExt = finder.GetFileName();
int nPos = strExt.ReverseFind('.');
if (nPos != -1)
{
strExt = strExt.Mid(nPos + 1).MakeLower();
if (!m_strFilterExt.IsEmpty() && m_strFilterExt.Find(strExt) == -1)
return false;
}
// 大小過濾 (KB)
ULONGLONG ullSize = finder.GetLength();
if (m_nMinSize > 0 && ullSize < (ULONGLONG)m_nMinSize * 1024)
return false;
if (m_nMaxSize > 0 && ullSize > (ULONGLONG)m_nMaxSize * 1024)
return false;
// 時間過濾 (天)
CTime timeMod;
finder.GetLastWriteTime(timeMod);
CTimeSpan span = CTime::GetCurrentTime() - timeMod;
if (m_nMinDays > 0 && span.GetDays() < m_nMinDays)
return false;
return true;
}
void CFileCleanerDlg::AddFileToList(const CFileFind& finder)
{
int nItem = m_listFiles.GetItemCount();
LVITEM lvi = {0};
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iItem = nItem;
lvi.iSubItem = 0;
lvi.pszText = LPSTR_TEXTCALLBACK; // 回調模式提高性能
lvi.lParam = (LPARAM)new CFileInfo(finder); // 自定義結構體存儲完整信息
m_listFiles.InsertItem(&lvi);
// 子項設置...
// 更新進度條
m_progress.SetPos(nItem % 100);
}
void CFileCleanerDlg::OnBnClickedBtnDelete()
{
// 1. 確認對話框
if (AfxMessageBox(_T("確定永久刪除選中的文件?"), MB_YESNO | MB_ICONWARNING) != IDYES)
return;
// 2. 遍歷選中項
POSITION pos = m_listFiles.GetFirstSelectedItemPosition();
while (pos)
{
int nItem = m_listFiles.GetNextSelectedItem(pos);
CFileInfo* pInfo = (CFileInfo*)m_listFiles.GetItemData(nItem);
if (pInfo)
{
// 移動到回收站 (推薦) 或永久刪除
SHFILEOPSTRUCT fos = {0};
fos.hwnd = m_hWnd;
fos.wFunc = FO_DELETE;
fos.pFrom = pInfo->strFullPath + _T('\0') + _T('\0'); // 雙重空終止
fos.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENT;
int nResult = SHFileOperation(&fos);
if (nResult == 0)
{
LogMessage(_T("已刪除: ") + pInfo->strFullPath);
m_listFiles.DeleteItem(nItem);
delete pInfo;
}
else
{
LogMessage(_T("刪除失敗: ") + pInfo->strFullPath + _T(" 錯誤碼: ") + CString(nResult));
}
}
}
}
| 功能 | 實現方案 |
|---|---|
| 大文件/大量文件性能 | 後台線程掃描 + PostMessage 更新 UI;虛擬列表模式 (LVS_OWNERDATA) |
| 刪除撤銷 | 使用 FOF_ALLOWUNDO 移至回收站;記錄刪除日志支持手動恢復 |
| 重複文件查找 | 計算 MD5/SHA256 哈希,分組比較 |
| 定時清理任務 | 寫入註冊表 Run 或任務計劃程序 |
| 系統垃圾清理 | 集成 SHGetKnownFolderPath 獲取 Temp、Prefetch、Recycle Bin 等特殊目錄 |
完整項目源碼可參考 CSDN 相關博客與開源項目,搜索關鍵詞「MFC 文件清理器 源碼」。