如何将 IFileOperation 与相对路径和绝对路径一起使用?
How to use IFileOperation with relative and absolute paths?
IFileOperation
等同于
是什么
SHFILEOPSTRUCTW op = {hDlg, FO_COPY, directoryFrom, directoryTo, 0, FALSE, NULL, NULL};
int status = SHFileOperationW(&op);
其中 directoryFrom
是相对于我的工作目录的目录路径,而 directoryTo
是绝对路径?
- 我可以直接将我的绝对路径传递给
SHCreateItemFromParsingName
以获得 IShellItem
吗?到底什么是解析名称和显示名称?
- 如果
SHCreateItemFromParsingName
适用于绝对路径,我应该将它与 GetFullPathNameW
结合使用来解析相对路径还是有更简单的替代方法?
我发现有关这些主题的文档可能会更好。
Windows Shell 被组织成称为 Shell 命名空间 的层次结构:Introduction to the Shell Namespace:
The Shell namespace organizes the file system and other objects
managed by the Shell into a single tree-structured hierarchy.
Conceptually, it is a larger and more inclusive version of the file
system.
意思是,在Shell命名空间中,有文件系统(或者我称之为“物理”,考虑到可能的内核文件系统也是物理的)项和虚拟项。虚拟物品的例子是:
- “这台电脑”文件夹
- 回收站(项目链接到文件系统)
- 控制面板(完全虚拟)
- 搜索文件夹(其中项目链接到其他项目)
- 自定义命名空间扩展(您可以 extend the Shell namespace 使用自定义 Shell 命名空间扩展来连接到数据库、云存储等)
- 等等
所有这些项目都使用相同的系统进行标识:PIDLs。 PIDL 之于 Shell 项就像完整文件路径之于(物理)文件或文件夹。
如果包含的文件夹支持,也可以使用由 IShellFolder::GetDisplayNameOf method and by _SHGDNF enumeration 间接定义的解析名称来识别项目。请注意 PIDL 是严格强制性的(每个项目都有一个),而解析名称不是。
从Windows Vista开始,建议使用IShellItem
-based API。并且 IFileDialog
也被推荐,因为它支持 PIDL(=> 虚拟项目),而不仅仅是文件系统路径。
SHCreateItemFromParsingName
的伪代码大致为:
- 调用
SHParseDisplayName(name)
=> 一个 PIDL(旧的基于 PIDL API)
- 调用
SHCreateItemFromIDList(pidl)
=> 一个 IShellItem
这确实证明 SHCreateItemFromParsingName
可以称为 SHCreateItemFromDisplayName
...
在内部,SHParseDisplayName
的代码大致是:
- 获取桌面的
IShellFolder
(桌面是 Shell 命名空间的根)
- call
IShellFolder::ParseDisplayName
(name) => 一个 PIDL(相对于 desktop 与绝对相同,因为 desktop 是命名空间根)
IShellFolder
是由 all 命名空间文件夹实现的接口:标准 Windows-提供的和自定义的,服务于文件系统项目或虚拟项目。
现在,IShellFolder::ParseDisplayName
实现有所不同。自定义 Shell 文件夹可以选择按照自己喜欢的方式实现它(这可能会导致问题)。
然而,桌面的 IShellFolder
实现相当复杂,并且理解文件系统路径代替 显示名称。 doc 表示:
A null-terminated Unicode string with the display name. Because each
Shell folder defines its own parsing syntax, the form this string can
take may vary. The desktop folder, for instance, accepts paths such as
"C:\My Docs\My File.txt". It also will accept references to items in
the namespace that have a GUID associated with them using the
"::{GUID}" syntax. For example, to retrieve a fully qualified
identifier list for the control panel from the desktop folder, you can
use the following:
::{CLSID for Control Panel}\::{CLSID for printers folder}
IFileOperation
等同于
SHFILEOPSTRUCTW op = {hDlg, FO_COPY, directoryFrom, directoryTo, 0, FALSE, NULL, NULL};
int status = SHFileOperationW(&op);
其中 directoryFrom
是相对于我的工作目录的目录路径,而 directoryTo
是绝对路径?
- 我可以直接将我的绝对路径传递给
SHCreateItemFromParsingName
以获得IShellItem
吗?到底什么是解析名称和显示名称? - 如果
SHCreateItemFromParsingName
适用于绝对路径,我应该将它与GetFullPathNameW
结合使用来解析相对路径还是有更简单的替代方法?
我发现有关这些主题的文档可能会更好。
Windows Shell 被组织成称为 Shell 命名空间 的层次结构:Introduction to the Shell Namespace:
The Shell namespace organizes the file system and other objects managed by the Shell into a single tree-structured hierarchy. Conceptually, it is a larger and more inclusive version of the file system.
意思是,在Shell命名空间中,有文件系统(或者我称之为“物理”,考虑到可能的内核文件系统也是物理的)项和虚拟项。虚拟物品的例子是:
- “这台电脑”文件夹
- 回收站(项目链接到文件系统)
- 控制面板(完全虚拟)
- 搜索文件夹(其中项目链接到其他项目)
- 自定义命名空间扩展(您可以 extend the Shell namespace 使用自定义 Shell 命名空间扩展来连接到数据库、云存储等)
- 等等
所有这些项目都使用相同的系统进行标识:PIDLs。 PIDL 之于 Shell 项就像完整文件路径之于(物理)文件或文件夹。
如果包含的文件夹支持,也可以使用由 IShellFolder::GetDisplayNameOf method and by _SHGDNF enumeration 间接定义的解析名称来识别项目。请注意 PIDL 是严格强制性的(每个项目都有一个),而解析名称不是。
从Windows Vista开始,建议使用IShellItem
-based API。并且 IFileDialog
也被推荐,因为它支持 PIDL(=> 虚拟项目),而不仅仅是文件系统路径。
SHCreateItemFromParsingName
的伪代码大致为:
- 调用
SHParseDisplayName(name)
=> 一个 PIDL(旧的基于 PIDL API) - 调用
SHCreateItemFromIDList(pidl)
=> 一个 IShellItem
这确实证明 SHCreateItemFromParsingName
可以称为 SHCreateItemFromDisplayName
...
在内部,SHParseDisplayName
的代码大致是:
- 获取桌面的
IShellFolder
(桌面是 Shell 命名空间的根) - call
IShellFolder::ParseDisplayName
(name) => 一个 PIDL(相对于 desktop 与绝对相同,因为 desktop 是命名空间根)
IShellFolder
是由 all 命名空间文件夹实现的接口:标准 Windows-提供的和自定义的,服务于文件系统项目或虚拟项目。
现在,IShellFolder::ParseDisplayName
实现有所不同。自定义 Shell 文件夹可以选择按照自己喜欢的方式实现它(这可能会导致问题)。
然而,桌面的 IShellFolder
实现相当复杂,并且理解文件系统路径代替 显示名称。 doc 表示:
A null-terminated Unicode string with the display name. Because each Shell folder defines its own parsing syntax, the form this string can take may vary. The desktop folder, for instance, accepts paths such as "C:\My Docs\My File.txt". It also will accept references to items in the namespace that have a GUID associated with them using the "::{GUID}" syntax. For example, to retrieve a fully qualified identifier list for the control panel from the desktop folder, you can use the following:
::{CLSID for Control Panel}\::{CLSID for printers folder}