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

纯粹的狂热分子

IFileOperation相当于什么

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

directoryFrom相对于我的工作目录的目录路径在哪里并且directoryTo是绝对的?

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

我发现有关这些主题的文档可能要好得多。

西蒙·穆里埃

Windows Shell 被组织成称为 Shell命名空间的层次结构Shell命名空间简介

Shell 命名空间将 Shell 管理的文件系统和其他对象组织到一个单一的树结构层次结构中。从概念上讲,它是文件系统的更大、更具包容性的版本。

它的意思是,在 Shell 命名空间中,有文件系统(或我称之为“物理”,也将可能的内核文件系统视为物理的)项和虚拟项。虚拟物品的例子是:

  • “这台电脑”文件夹
  • 回收站(项目链接到文件系统的地方)
  • 控制面板(完全虚拟)
  • 搜索文件夹(其中项目是指向其他项目的链接)
  • 自定义命名空间扩展(可以扩展Shell空间与自定义Shell空间扩展到连接到数据库,云存储等)
  • 等等。

所有这些项目都使用相同的系统进行标识:PIDLs一个PIDL是壳牌项目一个完整的文件路径是到(物理)文件或文件夹的内容。

项目也可以使用它们的解析名称来标识,该名称由IShellFolder::GetDisplayNameOf 方法_SHGDNF 枚举间接定义,如果包含的文件夹支持它。请注意,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. call IShellFolder::ParseDisplayName(name) => a PIDL(相对于桌面,与绝对相同,因为桌面是命名空间根)

IShellFolder所有命名空间文件夹实现的接口:标准的 Windows 提供的和自定义的,为文件系统项目或虚拟项目提供服务。

现在,IShellFolder::ParseDisplayName实施各不相同。自定义 Shell 文件夹可以选择以它喜欢的方式实现它(这可能会导致问题)。

然而,桌面的IShellFolder实现非常复杂,并且理解文件系统路径而不是显示名称DOC这样说:

带有显示名称的以空字符结尾的 Unicode 字符串。由于每个 Shell 文件夹都定义了自己的解析语法,因此该字符串可以采用的形式可能会有所不同。例如,桌面文件夹接受诸如“C:\My Docs\My File.txt”之类的路径。它还将接受对命名空间中具有使用“::{GUID}”语法关联的 GUID 的项的引用。例如,要从桌面文件夹中检索控制面板的完全限定标识符列表,您可以使用以下命令:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何用两个绝对路径(或URL)在Java中构造一个相对路径?

如何检查路径是绝对路径还是相对路径

如何在Linux中以编程方式获取给定相对路径的绝对路径?

如何使用Python以跨平台方式检查路径是绝对路径还是相对路径?

将JasperReports与相对路径一起使用

如何在golang中解析相对路径到绝对路径?

如何获取给定相对路径的绝对路径

给定两个绝对路径,如何找到相对路径?

Jasper Reports将绝对路径更改为相对路径?

MSBuild:给定绝对路径,如何获取文件的相对路径?

如何停止自动将所有文件的相对路径替换为绝对路径

将Typescript绝对路径转换为Node.js相对路径?

如何使用相对路径提取href的绝对URL?

如何使用pathlib在Python中获取两个绝对路径之间的相对路径?

如何从ctypes使用IFileOperation

如何在PowerShell中基于相对路径或绝对路径获取绝对路径?

如何将NSURL与相对路径一起使用?

使用Codeigniter将Ajax相对路径转换为绝对路径

如何在WordPress中将相对路径更改为绝对路径?

将%PATH%变量中程序的相对路径更改为绝对路径

如何可移植且可靠地将相对路径转换为绝对路径?

sed或awk替换模式之间的字符串(将绝对路径转换为相对路径)

如何从绝对路径和相对路径运行bash脚本

如何将绝对路径转换为相对路径?

将绝对路径更改为相对路径VBA

如何使用相对路径而不是绝对路径

如何让 Unity 将输出 png 保存到相对路径而不是绝对路径?

如何在 React 或 Next.js 中使用绝对路径而不是相对路径?

ASP.NET CORE 5 MVC 如何将绝对路径转换为相对路径?