2011-09-30 42 views
2

我正在爲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擴展對我來說是一個全新的話題,所以如果問題不完整,我很抱歉,我會根據需要改進我的問題。

謝謝!

+0

我對此一無所知,但ITransferSource有一對似乎專門用於此目的的方法:[EnterFolder](http://msdn.microsoft.com/zh-cn/library/bb774516 )和[LeaveFolder](http://msdn.microsoft.com/zh-cn/library/bb774523)。 – Luke

+0

嘿,這個工程!它並沒有修正迭代順序,但我期望它們(輸入Dir1,輸入Dir2,退出Dir2,退出Dir1)調用EnterFolder和LeaveFolder回調函數。您應該添加此評論作爲答案,以便我可以相信您並解決問題。 –

回答

1

從文檔看起來好像EnterFolderLeaveFolder方法將幫助你。

+0

再次感謝,我錯過了文檔中的這些方法。這不完全是我想要的,但我當然可以用它來工作。 –

+0

@BenoitMiller:你是怎麼使用這些的?我的情況幾乎相同,也沒有爲我調用EnterFolder和LeaveFolder。此外,我無法理解,他們如何呼籲將有助於刪除。你介意擴大一點嗎? –

+1

在我的RemoveItem處理程序中,如果刪除失敗,我將該文件夾的路徑存儲在別處(狀態結構與正在瀏覽的主對象相關聯,而不是PIDL)。然後,當LeaveFolder被調用時,如果路徑與我之前存儲的路徑相匹配,我知道我必須重試Delete請求。 –

相關問題