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

將檔案或目錄移至資源回收筒:SHFileOperation 實現

     編輯:VC 教學

核心代碼


#include 
#pragma comment(lib, "shell32.lib")

void DeleteToRecycleBin(const char *path) {
    SHFILEOPSTRUCTA op = {0};
    op.hwnd = NULL;                 // 無視窗關聯,靜默操作
    op.wFunc = FO_DELETE;           // 刪除操作
    op.pFrom = path;                // 來源路徑,雙重 null 結尾
    op.pTo = NULL;                  // 刪除無目標
    op.fFlags = FOF_ALLOWUNDO |     // 移至資源回收筒 (關鍵旗標)
                FOF_NOCONFIRMATION | // 不顯示確認對話框
                FOF_SILENT;          // 不顯示進度 UI
    op.hNameMappings = NULL;
    op.lpszProgressTitle = NULL;

    int result = SHFileOperationA(&op);
    if (result != 0) {
        // 處理錯誤,result 為錯誤碼 (參考 MSDN SHFileOperation 返回值)
    }
}

// 使用範例
DeleteToRecycleBin("C:\\Temp\0"); // 注意:字串必須雙重 null 結尾

關鍵點解析

  • FOF_ALLOWUNDO:核心旗標,啟用「移至資源回收筒」而非永久刪除。若無此旗標,檔案直接永久刪除。
  • pFrom 格式:必須以**雙重 null 結尾**(如 "C:\\Temp\0\0" 或陣列初始化 char path[] = "C:\\Temp\0\0"),支援多檔案以單一 null 分隔、雙重 null 結尾。
  • FOF_NOCONFIRMATION | FOF_SILENT:靜默操作,適合後台程式。互動式程式可保留確認對話框。
  • Unicode 版:SHFILEOPSTRUCTW + SHFileOperationW,pFrom 為 L"C:\\Temp\0\0"。
  • 權限:需對檔案/目錄有刪除權限;系統保護檔案、進行中檔案可能失敗。
  • 非同步:SHFileOperation 為同步阻塞呼叫,大量檔案會卡住 UI 執行緒,建議放入工作者執行緒。

進階:多檔案/目錄批次刪除


void DeleteMultipleToRecycleBin(const std::vector &paths) {
    std::string buffer;
    for (auto &p : paths) {
        buffer += p + '\0'; // 單一 null 分隔
    }
    buffer += '\0'; // 雙重 null 結尾

    SHFILEOPSTRUCTA op = {0};
    op.wFunc = FO_DELETE;
    op.pFrom = buffer.c_str();
    op.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENT;
    SHFileOperationA(&op);
}

替代方案:IFileOperation (Vista+)

現代 COM 介面 IFileOperation 提供非同步、進度回呼、更豐富的錯誤處理、UAC 整合。適合 Vista/Win7/10/11 新專案。XP 僅能用 SHFileOperation。

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