int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);
struct SHFILEOPSTRUCT {
HWND hwnd;
UINT wFunc; // FO_DELETE, FO_COPY, FO_MOVE, FO_RENAME
LPCSTR pFrom; // 來源路徑(雙 NULL 結尾,支援多檔)
LPCSTR pTo; // 目標路徑
FILEOP_FLAGS fFlags; // FOF_ALLOWUNDO 等
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
LPCSTR lpszProgressTitle;
};
wFunc = FO_DELETEfFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENTpFrom 必須是完整絕對路徑,以雙 NULL 結尾class CRecycleFile : public SHFILEOPSTRUCT {
public:
CRecycleFile() {
ZeroMemory(this, sizeof(*this));
wFunc = FO_DELETE;
fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENT;
}
BOOL Recycle(LPCTSTR pszFullPath) {
// 複製路徑到緩衝區,確保雙 NULL 結尾
lstrcpy(m_buffer, pszFullPath);
m_buffer[lstrlen(pszFullPath)+1] = '\0';
pFrom = m_buffer;
return SHFileOperation(this) == 0;
}
private:
TCHAR m_buffer[MAX_PATH * 2];
};
CRecycleFile rf;
if (rf.Recycle(L"C:\\Temp\\test.txt")) {
// 成功移至資源回收筒,使用者可在總管還原
}
編譯為 RECYCLE.EXE,在 CMD 中 recycle filename 即可移至資源回收筒。搭配 4DOS/4NT 別名 alias del=recycle 將 DEL 命令安全化。
FOF_ALLOWUNDO → 永久刪除