首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 對話框開發文件清理器:功能設計與核心代碼實現

     編輯:程式設計綜合問答

專案需求

開發一個基於 MFC 對話框的文件清理工具,支持指定目錄掃描、文件列表展示、按條件篩選(擴展名、大小、修改時間)、勾選刪除、日志記錄等功能。

界面設計要素

  • 目錄選擇:CEdit + CButton (調用 SHBrowseForFolder)
  • 篩選條件:CComboBox (擴展名)、CSpinButtonCtrl (大小/天數)
  • 文件列表:CListCtrl (Report 模式,勾選框列、名稱、大小、路徑、修改時間)
  • 操作按鈕:掃描、全選/反選、刪除選中、導出列表、清空日志
  • 進度/日志:CProgressCtrl + CListBox 或 CEdit (多行)

核心功能實現

1. 遞歸掃描目錄

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();
}

2. 文件篩選匹配

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;
}

3. 列表控件填充

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);
}

4. 安全刪除實現

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 文件清理器 源碼」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved