如何将IFileOperation与相对路径和绝对路径一起使用?

时间:2020-06-25 21:43:27

标签: winapi com windows-shell

IFileOperation等同于

SHFILEOPSTRUCTW op = {hDlg, FO_COPY, directoryFrom, directoryTo, 0, FALSE, NULL, NULL};
int status = SHFileOperationW(&op);

其中directoryFrom是相对于我的工作目录的目录路径,而directoryTo是绝对目录吗?

  1. 我可以直接将绝对路径传递到SHCreateItemFromParsingName以获得IShellItem吗?无论如何,解析名称和显示名称是什么?
  2. 如果SHCreateItemFromParsingName适用于绝对路径,我应该将它与GetFullPathNameW结合使用来解析相对路径吗?还是有更简单的替代方法?

我发现有关这些主题的文档可能会更好。

1 个答案:

答案 0 :(得分:2)

Windows Shell被组织为称为Shell 命名空间的层次结构:Introduction to the Shell Namespace

Shell名称空间组织文件系统和其他对象 由命令行管理程序管理成单个树结构层次结构。 从概念上讲,它是文件的更大,更具包容性的版本 系统。

它的意思是,在Shell命名空间中,有文件系统(或所谓的“物理”,考虑到可能的内核文件系统也是物理的)项和虚拟项。虚拟项目的示例是:

  • “此PC”文件夹
  • 回收站(其中的项目具有指向文件系统的链接)
  • 控制面板(完全虚拟)
  • 搜索文件夹(其中的项目是指向其他项目的链接)
  • 自定义名称空间扩展(您可以extend the Shell namespace与自定义Shell命名空间扩展一起连接到数据库,云存储等)

所有这些项目都使用同一系统PIDLs进行标识。 PIDL 对Shell项来说是指(物理)文件或文件夹的完整文件路径。

如果包含的文件夹支持,则也可以使用由IShellFolder::GetDisplayNameOf method_SHGDNF enumeration间接定义的解析名称来标识项目。请注意, PIDL 是严格强制性的(每个项目都有一个),而解析名称则不是。

从Windows Vista开始,建议使用基于IShellItem的API。并且还建议使用IFileDialog,因为它不仅支持文件系统路径,而且还支持PIDL(=>虚拟项目)。

SHCreateItemFromParsingName的伪代码或多或少:

  1. 调用SHParseDisplayName(name) =>一个PIDL(基于PIDL的旧API)
  2. 调用SHCreateItemFromIDList(pidl) =>一个IShellItem

确实证明SHCreateItemFromParsingName可以被称为SHCreateItemFromDisplayName ...

在内部,SHParseDisplayName的代码或多或少:

  1. 获取桌面的IShellFolder(桌面是Shell命名空间的根)
  2. 调用IShellFolder::ParseDisplayName(name)=> PIDL(相对于桌面,因为桌面是名称空间的根,所以它与绝对值相同)

IShellFolder是由 all 名称空间文件夹实现的接口:标准的Windows提供的文件夹和自定义的文件夹,用于提供文件系统项或虚拟项。

现在,IShellFolder::ParseDisplayName的实现有所不同。定制的Shell文件夹可以选择以喜欢的方式实现它(这可能会引起问题)。

然而,台式机的IShellFolder实现非常复杂,并且可以理解文件系统路径来代替显示名称doc这样说:

以显示名称结尾的以Null结尾的Unicode字符串。因为每个 Shell文件夹定义了自己的语法,该字符串可以 服用可能有所不同。例如,桌面文件夹接受诸如以下的路径 “ C:\ My Docs \ My File.txt”。它还将接受对以下项目的引用 使用GUI将GUID与之关联的名称空间 “ :: {GUID}”语法。例如,检索完全合格的 您可以从桌面文件夹中找到控制面板的标识符列表 使用以下内容:

:: {控制面板的CLSID} \ :: {打印机文件夹的CLSID}