今天看到一個關於SHFileOperation函數使用的介紹,發現下面一些有用的資料,都是些之前未仔細瞭解的方面,這裏把他們記錄下來,留待以後查閱參考。
fFlags成員標誌間的關係
標誌 |
抑制的對話框 |
相關性與優先級 |
FOF_MULTIDESTFILES |
無 |
無 |
FOF_FILESONLY |
無 |
無 |
FOF_SILENT |
如果設置,進度對話框不顯示。 |
優先於FOF_SIMPLEPROGRESS標誌。 |
FOF_SIMPLEPROGRESS |
無 |
爲FOF_SILENT標誌所抑制。 |
FOF_RENAMEONCOLLISION |
如果設置了這個標誌,當被移動或拷貝的文件與已存在文件同名時置換對話框不會出現。 |
名字衝突時,如果FOF_NOCONFIRMATION標誌設置,則操作繼續。 如果二者都設置了,則它優先於FOF_NOCONFIRMATION。即,文件以給定的新名字複製,而不是覆蓋。 |
FOF_NOCONFIRMATION |
如果設置,確認對話框在任何情況下都不出現。 |
名字衝突時,引起文件覆蓋,除非設置了FOF_RENAMEONCOLLISION標誌。 |
FOF_NOCONFIRMMKDIR |
抑制請求建立新文件夾的對話框 |
缺省目錄作爲嚴重錯誤產生一個錯誤消息框。 建立目錄的確認對話框作爲錯誤消息框是否顯示依賴於FOF_NOERRORUI的設置。 |
FOF_NOERRORUI |
抑制所有錯誤消息框。 |
優先於前一個標誌。如果設置,則,缺省目錄引起不被處理的異常,並且返回錯誤碼。 |
刪除文件
文件刪除是一個簡單的操作,它僅僅影響到輸入緩衝pFrom,而pTo緩衝被忽略。與文件複製一樣,操作的詳細情況依賴於標誌的設置。相關的標誌是:
標誌 |
值 |
描述 |
FOF_SILENT |
0×0004 |
這個操作不回饋給用戶,就是說,不顯示進度對話框。相關的消息框仍然顯示。 |
FOF_NOCONFIRMATION |
0×0010 |
這個標誌使函數對任何遇到的消息框都自動回答Yes。 |
FOF_ALLOWUNDO |
0×0040 |
如果設置,這個標誌強迫函數移動被刪除的文件到‘回收站’中。否則,文件將被物理地從磁盤上刪除。 |
FOF_FILESONLY |
0×0080 |
設置這個標誌導致函數僅僅刪除文件,跳過目錄項。它僅僅應用於指定通配符的情況。 |
FOF_SIMPLEPROGRESS |
0×0100 |
這導致簡化用戶界面。使之只有動畫而不報告被刪除的文件名。代之的是顯示lpszProgressTitle成員中指定的文字。(Win7實際中貌似不可用) |
FOF_NOERRORUI |
0×0400 |
如果設置了這個標誌,任何發生的錯誤都不能使消息框顯示,而是程序中返回錯誤碼。 |
這裏出現的標誌最要緊的是FOF_ALLOWUNDO,它決定文件是否一次就全部刪除,或存儲到‘回收站’中等候可能的恢復。如果FOF_ALLOWUNDO被設置,文件則被移動到回收站,並且這個操作可以被Undo(儘管可以手動Undo)。Undo特徵僅在刪除下可用,在拷貝與移動中沒有等價的操作。
SHFileOperation()函數的返回值
MSDN資料中說明,SHFileOperation()在成功時返回0,失敗時返回非0值。顯然這是真的,但並不是最有用的解釋。重複測試這個函數,可以確信它有非常多的終止方式。事實上,我們經常在系統錯誤的提示中運行,在有些地方這個函數只是簡單地返回從更靠近文件系統的其它程序中獲得的返回碼。下面列表給出了SHFileOperation()返回的最通常的部分錯誤。
錯誤碼 |
描述 |
2 |
如果你試圖重命名多重文件,這個消息就會出現。描述是相當直接的:系統不能找到指定的文件。 |
7 |
在詢問是否想要置換給定文件時,你回答了‘取消’,函數就返回這個錯誤碼。它的描述也是相當的不明確—存儲控制塊被銷燬。 |
115 |
在試圖重命名文件到不同的文件夾時,發生這個文件系統錯。重命名文件只是改變文件名,而不能改變文件夾。 |
117 |
一個IOCTL錯(輸入/輸出控制),在目的路徑中有錯誤時或取消了新目錄的建立時,這個錯誤發生了。 |
123 |
你正在試圖重命名一個文件,然而你給出的名字是一個已經存在的文件。它也有一個無用的描述:文件名,目錄名,或卷標號的語法是不正確的。 |
1026 |
在試圖移動或拷貝一個不存在的文件時,出現這個文件系統錯。一般地,它提示了,源緩衝中的某些東西應該修改一下。這個錯誤碼彈出一個的錯誤框,你可以通過設置FOF_NOERRORUI標誌抑制它的顯示。 |