我正在为 Windows 7 上的网络文件系统实现 Windows Explorer Shell 扩展,但在实现删除功能时遇到了障碍。
假设我的远程文件系统层次结构如下:
Dir1
+-Dir2
| +-A
| +-B
+-C
我的理解是你需要实现 ITransferSource::RemoveItem
(我已经完成了),但我希望首先从文件系统树中最远的 child 递归调用(即深度-第一次递归遍历):
(A, B, Dir2, C, Dir1)
发生的事情是我首先被要求为根,然后是每个 child ,迭代地:
(Dir1, C, Dir2, A, B)
这对我来说有点奇怪,因为 Shell 已经递归地遍历所有要删除的项目以显示操作的进度条(“发现项目”对话框)。我的远程文件系统不支持删除非空目录;据我所知,Windows 上的本地文件系统也有同样的限制。我在 MSDN 上找不到任何关于更改迭代顺序的提示。
我假设实际的迭代顺序因文件系统中项目的创建顺序而异。
当实现这个接口(interface)方法时,如果你自己递归和删除整棵树,你可以返回 COPYENGINE_S_DONT_PROCESS_CHILDREN
,但我认为这将不允许用户取消正在进行的删除(就像标准的 Explorer shell将)。我认为这是一个次优的解决方案,但如果我找不到更好的解决方案,我可能不得不这样做。
我的第一个想法是将非空目录删除请求排队等待稍后使用,但我认为这行不通,因为扩展程序不知道何时完成对一个目录的所有子目录的删除操作。我也可以生成一个线程以“稍后”删除这些项目,但这几乎肯定会产生奇怪的无法解释的行为和崩溃。
所以,我想我的问题是,在 Windows 7 Shell 扩展中实现删除操作的正确方法是什么?
PS:您可能已经知道,Windows Shell Extensions 对我来说是一个全新的话题,所以如果问题不完整,我提前道歉;我会根据需要完善我的问题。
谢谢!
最佳答案
从文档来看,它看起来像 EnterFolder和 LeaveFolder方法将帮助您。
关于Windows 资源管理器外壳扩展:通过 ITransferSource::RemoveItem 递归删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7611608/