【发布时间】:2011-09-30 14:10:06
【问题描述】:
我正在为 Windows 7 上的网络文件系统实现 Windows Explorer Shell 扩展,但在实现删除功能时遇到了障碍。
假设我的远程文件系统层次结构如下:
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,但我认为这将不允许用户取消正在进行的删除(就像标准的 Explorer shell 一样)。我认为这是一个次优的解决方案,但如果我找不到更好的解决方案,它可能不得不这样做。
我的第一个想法是将非空目录删除请求排队等待以后,但我认为这不会起作用,因为扩展程序不会知道目录的所有子目录的删除操作何时完成。我还可以创建一个线程“稍后”删除这些项目,但这几乎肯定会产生奇怪的无法解释的行为和崩溃。
所以,我想我的问题是,在 Windows 7 Shell 扩展中实现删除操作的正确方法是什么?
PS:您可能会说,Windows Shell Extensions 对我来说是一个全新的话题,所以如果问题不完整,我提前道歉;我会根据需要完善我的问题。
谢谢!
【问题讨论】:
-
我对此一无所知,但 ITransferSource 有一对似乎正是为此目的而设计的方法:EnterFolder 和 LeaveFolder。
-
嘿,这行得通!它不会修复迭代顺序,但会调用
EnterFolder和LeaveFolder回调,正如我所期望的那样(输入 Dir1,输入 Dir2,离开 Dir2,离开 Dir1)。您应该将此评论添加为答案,以便我感谢您并关闭问题。
标签: windows winapi windows-shell shell-extensions