我正在爲Windows 7上的網絡文件系統實施Windows資源管理器外殼擴展,並且在實現刪除功能時遇到了一些障礙。Windows資源管理器外殼擴展:通過ITransferSource :: RemoveItem遞歸刪除?
比方說,我的遠程文件系統層次結構如下所示:
Dir1
+-Dir2
| +-A
| +-B
+-C
我的理解是,你需要實現ITransferSource::RemoveItem
(我做了),但我預計從最遠的孩子遞歸調用文件系統樹的第一(即深度優先遞歸遍歷):
(A, B, Dir2, C, Dir1)
什麼情況是,我呼籲根第一,那麼每個孩子,反覆:
(Dir1, C, Dir2, A, B)
這對我來說有點奇怪,因爲爲了顯示操作的進度條(「發現項目」對話框),Shell已經遞歸地迭代了要刪除的所有項目。我的遠程文件系統不支持刪除非空目錄;據我所知,Windows上的本地文件系統具有相同的限制。我無法在MSDN上找到關於更改迭代順序的提示。
我認爲實際的迭代順序取決於文件系統中項目的創建順序。
實現此接口方法時,如果您自己遞歸併刪除整個樹,則可以返回COPYENGINE_S_DONT_PROCESS_CHILDREN
,但我認爲這不會允許用戶取消正在進行的刪除操作(如標準資源管理器shell)。我認爲這是一個次優解決方案,但如果我找不到更好的解決方案,可能需要做。
我的第一個想法是爲以後排隊非空目錄刪除請求,但我不認爲這會起作用,因爲擴展程序不知道何時完成目錄的所有子項的刪除操作。我也可以產生一個線程以「稍後」刪除這些項目,但這幾乎肯定會造成奇怪的無法解釋的行爲和崩潰。
所以,我想我的問題是,在Windows 7 Shell擴展中實現刪除操作的正確方法是什麼? PS:正如你可能知道的那樣,Windows Shell擴展對我來說是一個全新的話題,所以如果問題不完整,我很抱歉,我會根據需要改進我的問題。
謝謝!
我對此一無所知,但ITransferSource有一對似乎專門用於此目的的方法:[EnterFolder](http://msdn.microsoft.com/zh-cn/library/bb774516 )和[LeaveFolder](http://msdn.microsoft.com/zh-cn/library/bb774523)。 – Luke
嘿,這個工程!它並沒有修正迭代順序,但我期望它們(輸入Dir1,輸入Dir2,退出Dir2,退出Dir1)調用EnterFolder和LeaveFolder回調函數。您應該添加此評論作爲答案,以便我可以相信您並解決問題。 –