VC實現將文件放入回收站

 CFile類中的Remove()函數來刪除一個文件,但是這樣的操作將永久性的刪除該文件,不能在必要的時候再恢復該文件,解決這個問題的方法就是把文件送到Windows系統中的回收站裏面,而不是簡單的永久性刪除它,這樣用戶就可以在必要的時候恢復這個文件。
      在Windows的shellapi文件中定義了一個名爲SHFileOperation()的外殼函數,用它可以實現各種文件操作,如文件的拷貝、刪除、移動等,該函數使用起來非常簡單,它只有一個指向SHFILEOPSTRUCT結構的參數。使用SHFileOperation()函數時只要填寫該專用結構--SHFILEOPSTRUCT,告訴Windows執行什麼樣的操作,以及其它重要信息就行了。SHFileOperation()的特別之處在於它是一個高級外殼函數,不同於低級文件處理。當調用SHFileOperation操作文件時,相應的外殼拷貝處理器(如果有的話)被調用。如在刪除某個文件時,SHFileOperation會將刪除的文件放到回收站中。SHFileOperation()函數的原形爲:  

  WINSHELLAPI int WINAPI SHFileOperation (LPSHFILEOPSTRUCT lpFIleOp);

  函數中參數類型爲一個LPSHFILEOPSTRUCT結構,它包含有進行文件操作的各種信息,其具體的結構如下:  

  Typedef struct _ShFILEOPSTRUCT
  {
   HWND hWnd; //消息發送的窗口句柄;
   UINT wFunc; //操作類型
   LPCSTR pFrom; //源文件及路徑
   LPCSTR pTo; //目標文件及路徑
   FILEOP_FLAGS fFlags; //操作與確認標誌
   BOOL fAnyOperationsAborted; //操作選擇位
   LPVOID hNameMappings; //文件映射
   LPCSTR lpszProgressTitle; //文件操作進度窗口標題
  }SHFILEOPSTRUCT, FAR * LPSHFILEOPSTRUCT;   

  在這個結構中,hWnd是指向發送消息的窗口句柄,pFrom與pTo是進行文件操作的源文件名和目標文件名,它包含文件的路徑,對應單個文件的路徑字符串,或對於多個文件,必須以NULL作爲字符串的結尾或文件路徑名之間的間隔,否則在程序運行的時候會發生錯誤。另外,pFrom和pTo都支持通配符*和?,這大大方便了開發人員的使用。例如,源文件或目錄有兩個,則應是:char pFrom[]="E:\\Test1\0E:\\Text.txt\0",它表示對要E:盤Test目錄下的所有文件和E:盤上的Text.txt文件進行操作。字符串中的"\\"是'\'的轉義符,'\0'則是NULL。
    wFunc 是結構中的一個非常重要的成員,它代表着函數將要進行的操作類型,它的取值爲如下:
  ·FO_COPY: 拷貝文件pFrom到pTo 的指定位置。
  ·FO_RENAME: 將pFrom的文件名更名爲pTo的文件名。
  ·FO_MOVE: 將pFrom的文件移動到pTo的地方。
  ·FO_DELETE: 刪除pFrom指定的文件。

  使用該函數進行文件拷貝、移動或刪除時,如果需要的時間很長,則程序會自動在進行的過程中出現一個無模式的對話框(Windows操作系統提供的文件操作對話框),用來顯示執行的進度和執行的時間,以及正在拷貝、移動或刪除的文件名,此時結構中的成員lpszProgressTitle顯示此對話框的標題。fFlags是在進行文件操作時的過程和狀態控制標識。它主要有如下一些標識,也可以是其組合:

  ·FOF_FILESONLY:執行通配符,只執行文件;
  ·FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢復文件;
  ·FOF_NOCONFIRMATION:在出現目標文件已存在的時候,如果不設置此項,則它會出現確認是否覆蓋的對話框,設置此項則自動確認,進行覆蓋,不出現對話框。
  ·FOF_NOERRORUI:設置此項後,當文件處理過程中出現錯誤時,不出現錯誤提示,否則會進行錯誤提示。
  ·FOF_RENAMEONCOLLISION:當已存在文件名時,對其進行更換文提示。
  ·FOF_SILENT:不顯示進度對話框。
  ·FOF_WANTMAPPINGHANDLE:要求SHFileOperation()函數返回正處於操作狀態的實際文件列表,文件列表名柄保存在hNameMappings成員中。
  ·SHFILEOPSTRUCT結構還包含一個SHNAMEMAPPING結構的數組,此數組保存由SHELL計算的每個處於操作狀態的文件的新舊路徑。

  在使用該函數刪除文件時必須設置SHFILEOPSTRUCT結構中的神祕FOF_ALLOWUNDO標誌,這樣才能將待刪除的文件拷到回收站,從而使用戶可以撤銷刪除操作。需要注意的是,如果pFrom設置爲某個文件名,用FO_DELETE標誌刪除這個文件並不會將它移到回收站,甚至設置FOF_ALLOWUNDO標誌也不行,在這裏你必須使用全路徑名,這樣SHFileOperation纔會將刪除的文件移到 回收站。

      編碼實現:
      在VC中新建一個MFC工程(單文檔、多文檔、對話框都可,SDK、命令行也行,本例是多文檔工程)
添加一菜單項,爲其添加事件處理函數,函數中的具體代碼如下:

    int nOk;
    char strSrc[]="E:\\Test\0";//源文件路徑,注意要加'\0'
    char strDst[]="E:\\Test\0";//目標文件路徑,注意要加'\0'
    char strTitle[]="文件拷貝"; //文件刪除進度對話框標題
    SHFILEOPSTRUCT FileOp;//定義SHFILEOPSTRUCT結構對象;
    FileOp.hwnd=this->m_hWnd;
    FileOp.wFunc=FO_DELETE; //執行文件刪除操作;
    FileOp.pFrom=strSrc;
    FileOp.pTo=strDst;
    FileOp.fFlags=FOF_ALLOWUNDO;//此標誌使刪除文件備份到Windows回收站
    FileOp.hNameMappings=NULL;
    FileOp.lpszProgressTitle=strTitle;
    //開始刪除文件
    nOk=SHFileOperation(&FileOp);
    if(nOk)
        TRACE("出錯: %d\n",nOk);
    else
        TRACE("操作成功\n");

發佈了31 篇原創文章 · 獲贊 16 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章