首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 實現檔案移至資源回收筒而非永久刪除

     編輯:關於VC++

前言

使用 CFile::Remove() 會永久刪除檔案,無法復原。為提供使用者「後悔藥」,應呼叫 Shell API SHFileOperation 將檔案移至資源回收筒。本文詳細說明該函式結構與旗標設定,並提供完整 MFC 範例程式碼。

核心函式:SHFileOperation

SHFileOperation 是高階 Shell 函式,支援複製、移動、重命名、刪除等操作,並自動處理進度對話框、錯誤提示及回收筒機制。其原型為:

int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);

唯一參數為 SHFILEOPSTRUCT 結構指標,關鍵成員說明:

成員說明
hwnd父視窗控制代碼,用於顯示進度/錯誤對話框
wFunc操作類型:FO_DELETE 刪除、FO_COPY 複製、FO_MOVE 移動、FO_RENAME 重命名
pFrom來源檔案完整路徑,多檔案以雙 Null 結尾分隔,支援萬用字元
pTo目標路徑(刪除操作可忽略)
fFlags控制旗標組合,關鍵值見下表
lpszProgressTitle進度對話框標題

關鍵旗標 fFlags

  • FOF_ALLOWUNDO:將刪除檔案放入回收筒,支援復原(必要)
  • FOF_NOCONFIRMATION:覆寫時不詢問確認
  • FOF_NOERRORUI:不顯示錯誤 UI
  • FOF_SILENT:不顯示進度對話框
  • FOF_FILESONLY:萬用字元僅匹配檔案

程式設計步驟與範例

  1. 建立 MFC 單一檢視專案,加入選單項目 ID_FILE_DELETE 並關聯 OnFileDelete。
  2. 在處理函式中填寫 SHFILEOPSTRUCT 並呼叫 SHFileOperation。
void CFileOperationView::OnFileDelete() {
    SHFILEOPSTRUCT FileOp = {0};
    FileOp.hwnd = this->m_hWnd;
    FileOp.wFunc = FO_DELETE;
    // 來源路徑必須為完整路徑並以雙 Null 結尾,否則不會進回收筒
    char strSrc[] = "d:\\Vb\\0";  // 實際應為 "d:\\Vb\\*.*" 等
    char strDst[] = "";           // 刪除操作不需目標
    char strTitle[] = "檔案刪除進度";

    FileOp.pFrom = strSrc;
    FileOp.pTo = strDst;
    FileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION; // 進回收筒且不確認
    FileOp.lpszProgressTitle = strTitle;

    int nResult = SHFileOperation(&FileOp);
    if (nResult)
        TRACE(_T("刪除失敗,錯誤碼: %d\n"), nResult);
    else
        TRACE(_T("檔案已移至資源回收筒\n"));
}

重要注意事項

  • pFrom 必須為完整路徑:若僅提供檔名(如 Test.txt),即使設定 FOF_ALLOWUNDO 也不會進回收筒。
  • 多檔案路徑以 \0 分隔,結尾需雙 \0(如 "C:\\A.txt\0C:\\B.txt\0\0")。
  • 該方法同樣支援目錄樹操作,行為與總管一致,確保系統一致性。

總結

善用 SHFileOperation 可輕鬆實現符合 Windows 使用者習慣的檔案刪除功能,程式碼簡潔且功能強大,是取代 CFile::Remove 的最佳選擇。

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