使用 CFile::Remove() 會永久刪除檔案,無法復原。為提供使用者「後悔藥」,應呼叫 Shell API SHFileOperation 將檔案移至資源回收筒。本文詳細說明該函式結構與旗標設定,並提供完整 MFC 範例程式碼。
SHFileOperation 是高階 Shell 函式,支援複製、移動、重命名、刪除等操作,並自動處理進度對話框、錯誤提示及回收筒機制。其原型為:
int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);
唯一參數為 SHFILEOPSTRUCT 結構指標,關鍵成員說明:
| 成員 | 說明 |
|---|---|
| hwnd | 父視窗控制代碼,用於顯示進度/錯誤對話框 |
| wFunc | 操作類型:FO_DELETE 刪除、FO_COPY 複製、FO_MOVE 移動、FO_RENAME 重命名 |
| pFrom | 來源檔案完整路徑,多檔案以雙 Null 結尾分隔,支援萬用字元 |
| pTo | 目標路徑(刪除操作可忽略) |
| fFlags | 控制旗標組合,關鍵值見下表 |
| lpszProgressTitle | 進度對話框標題 |
FOF_ALLOWUNDO:將刪除檔案放入回收筒,支援復原(必要)FOF_NOCONFIRMATION:覆寫時不詢問確認FOF_NOERRORUI:不顯示錯誤 UIFOF_SILENT:不顯示進度對話框FOF_FILESONLY:萬用字元僅匹配檔案ID_FILE_DELETE 並關聯 OnFileDelete。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"));
}
Test.txt),即使設定 FOF_ALLOWUNDO 也不會進回收筒。\0 分隔,結尾需雙 \0(如 "C:\\A.txt\0C:\\B.txt\0\0")。善用 SHFileOperation 可輕鬆實現符合 Windows 使用者習慣的檔案刪除功能,程式碼簡潔且功能強大,是取代 CFile::Remove 的最佳選擇。