#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 結尾
"C:\\Temp\0\0" 或陣列初始化 char path[] = "C:\\Temp\0\0"),支援多檔案以單一 null 分隔、雙重 null 結尾。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);
}
現代 COM 介面 IFileOperation 提供非同步、進度回呼、更豐富的錯誤處理、UAC 整合。適合 Vista/Win7/10/11 新專案。XP 僅能用 SHFileOperation。