Windows 资源管理器外壳扩展:通过 ITransferSource::RemoveItem 递归删除?

标签 windows winapi windows-shell shell-extensions

我正在为 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 对我来说是一个全新的话题,所以如果问题不完整,我提前道歉;我会根据需要完善我的问题。

谢谢!

最佳答案

从文档来看,它看起来像 EnterFolderLeaveFolder方法将帮助您。

关于Windows 资源管理器外壳扩展:通过 ITransferSource::RemoveItem 递归删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7611608/

相关文章:

c++ - 如何将Std::set_terminate与SetUnhandledExceptionFilter一起使用?

windows-server-2008-r2 - 使用 GetOpenFileName 时 C 应用程序崩溃。 DEP 阻止了崩溃

windows - 我必须做什么才能使我的 WH_SHELL 或 WH_CBT Hook 过程从其他进程接收事件?

c++ - 插入USB时如何触发事件

Java 控制 Windows 服务器

c++ - Windows XP 用户文件夹的 CSIDL 常量

windows - 如何替换资源管理器的 TIF 图像处理程序?

java - libGDX:如何实现基于平铺/网格的游戏角色移动?

c++ - GlobalAddAtom() 在 Win7 上返回 0 和 GetLastError = 0x5,在 XP 上有效

windows - gsutil rsync 排除模式不适用于 Windows Powershell