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

SHFileOperation 移動檔案到資源回收筒:FOF_ALLOWUNDO 旗標關鍵作用

     編輯:關於VC++

核心 API

int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);

SHFILEOPSTRUCT 關鍵欄位

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;
};

移至資源回收筒的必要條件

  1. wFunc = FO_DELETE
  2. fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENT
  3. pFrom 必須是完整絕對路徑,以雙 NULL 結尾

CRecycleFile 封裝類別

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 → 永久刪除
  • 網路路徑、可移動磁碟可能不支援資源回收筒
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved