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

SHFileOperation 實現檔案/資料夾移至資源回收筒 (而非永久刪除)

     編輯:關於C++

Windows Shell 提供 SHFileOperation 高階 API,支援**複製、移動、重命名、刪除**並自動處理進度對話框、錯誤重試、資源回收筒、撤銷資訊。本文示範如何正確設定 `SHFILEOPSTRUCT` 將檔案或資料夾「移至資源回收筒」。

核心結構體設定

SHFILEOPSTRUCT fos = {0};
fos.hwnd   = Handle;              // 父視窗 (用於進度對話框置中)
fos.wFunc  = FO_DELETE;           // 操作類型:刪除
fos.pFrom  = L"C:\\Temp\\Test\0"; // 來源路徑,**雙重 Null 結尾** (多路徑以單一 Null 分隔)
fos.pTo    = nullptr;             // 刪除操作不需目的路徑
fos.fFlags = FOF_ALLOWUNDO |      // 關鍵:放入資源回收筒 (可撤銷)
             FOF_NOCONFIRMATION | // 不顯示確認對話框
             FOF_SILENT;          // 不顯示進度 UI (視需求)
fos.hNameMappings = nullptr;
fos.lpszProgressTitle = nullptr;

關鍵細節:雙重 Null 結尾字串

`pFrom` / `pTo` 必須以 **兩個連續 `\0`** 結尾。單一路徑範例:

wchar_t path[] = L"C:\\Temp\\Test\0\0"; // 手動雙重結尾
// 或動態建構
std::wstring s = L"C:\\Temp\\Test";
s.push_back(L'\0'); s.push_back(L'\0');
fos.pFrom = s.c_str();

完整範例 (C++ Builder / MFC / 純 Win32)

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

bool DeleteToRecycleBin(HWND hwnd, const std::wstring& path)
{
    std::wstring src = path + L'\0' + L'\0'; // 雙重 Null
    SHFILEOPSTRUCTW fos = {0};
    fos.hwnd = hwnd;
    fos.wFunc = FO_DELETE;
    fos.pFrom = src.c_str();
    fos.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT;
    // FOF_NOERRORUI: 錯誤時不彈出對話框,改由回傳值判斷

    int result = SHFileOperationW(&fos);
    return (result == 0) && !fos.fAnyOperationsAborted;
}

常用旗標組合

旗標效果
FOF_ALLOWUNDO放入資源回收筒 (預設永久刪除)
FOF_NOCONFIRMATION不顯示「確定要刪除?」對話框
FOF_SILENT不顯示進度動畫/對話框
FOF_NOERRORUI錯誤時不彈出 UI,回傳錯誤碼
FOF_RENAMEONCOLLISION複製/移動時同名自動重新命名
FOF_WANTNUKEWARNING永久刪除時顯示特別警告 (Win10+)

回傳值判斷

  • 0:成功完成。
  • 非 0:失敗,呼叫 `GetLastError()` 或檢查 `fos.fAnyOperationsAborted` (使用者取消)。
  • 若 `fFlags` 未含 `FOF_NOERRORUI`,系統會自行彈出錯誤對話框,回傳值仍為錯誤碼。

進階:取得已刪除項目在資源回收筒中的路徑

需使用 `IFileOperation` (Vista+) + `IShellItem` + `IShellFolder` 列舉 `FOLDERID_RecycleBinFolder`,較複雜,通常僅需「可撤銷」即可。

結語

設定 `FOF_ALLOWUNDO` 並正確構造雙重 Null 結尾路徑,即可用 `SHFileOperation` 安全地將檔案/資料夾移至資源回收筒。此 API 自動處理長路徑、網路路徑、權限提示、進度 UI,是檔案管理操作的首選高階介面。

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