【问题标题】:Windows Explorer Shell Extension: recursive delete via ITransferSource::RemoveItem?Windows 资源管理器外壳扩展:通过 ITransferSource::RemoveItem 递归删除?
【发布时间】: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 有一对似乎正是为此目的而设计的方法:EnterFolderLeaveFolder
  • 嘿,这行得通!它不会修复迭代顺序,但会调用 EnterFolderLeaveFolder 回调,正如我所期望的那样(输入 Dir1,输入 Dir2,离开 Dir2,离开 Dir1)。您应该将此评论添加为答案,以便我感谢您并关闭问题。

标签: windows winapi windows-shell shell-extensions


【解决方案1】:

从文档看来,EnterFolderLeaveFolder 方法可以帮助您。

【讨论】:

  • 再次感谢,我错过了文档中的那些方法。这不是我想要的,但我当然可以做到。
  • @BenoitMiller:你是如何使用这些的?我的情况几乎相同,没有为我调用 EnterFolder 和 LeaveFolder。此外,我无法理解让他们打电话对删除有什么帮助。你介意扩大一点吗?
  • 在我的 RemoveItem 处理程序中,如果删除失败,我会将文件夹的路径存储在其他位置(与我正在浏览的主要对象相关联的状态结构,而不是 PIDL)。然后当调用 LeaveFolder 时,如果路径与我之前存储的路径匹配,我知道我必须重试 Delete 请求。
  • 调用这些方法没有任何问题,我只是在调用 IShellFolder2::CreateViewObject 时返回一个指向 ITransferSource 接口的指针。然后,当调用 ITransferSource::LeaveFolder 时,我会查找我自己的 ptr 以获取传递的 shellitem 并调用一个执行任何挂起操作的函数(在我的情况下,删除失败)。
猜你喜欢
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
相关资源
最近更新 更多