IFileOperation
等同于
SHFILEOPSTRUCTW op = {hDlg, FO_COPY, directoryFrom, directoryTo, 0, FALSE, NULL, NULL};
int status = SHFileOperationW(&op);
其中directoryFrom
是相对于我的工作目录的目录路径,而directoryTo
是绝对目录吗?
SHCreateItemFromParsingName
以获得IShellItem
吗?无论如何,解析名称和显示名称是什么?SHCreateItemFromParsingName
适用于绝对路径,我应该将它与GetFullPathNameW
结合使用来解析相对路径吗?还是有更简单的替代方法?我发现有关这些主题的文档可能会更好。
答案 0 :(得分:2)
Windows Shell被组织为称为Shell 命名空间的层次结构:Introduction to the Shell Namespace:
Shell名称空间组织文件系统和其他对象 由命令行管理程序管理成单个树结构层次结构。 从概念上讲,它是文件的更大,更具包容性的版本 系统。
它的意思是,在Shell命名空间中,有文件系统(或所谓的“物理”,考虑到可能的内核文件系统也是物理的)项和虚拟项。虚拟项目的示例是:
所有这些项目都使用同一系统PIDLs进行标识。 PIDL 对Shell项来说是指(物理)文件或文件夹的完整文件路径。
如果包含的文件夹支持,则也可以使用由IShellFolder::GetDisplayNameOf method和_SHGDNF enumeration间接定义的解析名称来标识项目。请注意, PIDL 是严格强制性的(每个项目都有一个),而解析名称则不是。
从Windows Vista开始,建议使用基于IShellItem
的API。并且还建议使用IFileDialog
,因为它不仅支持文件系统路径,而且还支持PIDL(=>虚拟项目)。
SHCreateItemFromParsingName
的伪代码或多或少:
SHParseDisplayName(name)
=>一个PIDL(基于PIDL的旧API)SHCreateItemFromIDList(pidl)
=>一个IShellItem 确实证明SHCreateItemFromParsingName
可以被称为SHCreateItemFromDisplayName
...
在内部,SHParseDisplayName
的代码或多或少:
IShellFolder
(桌面是Shell命名空间的根)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}