是否可以使用 CFSTR_FILEDESCRIPTOR 拖放来创建文件夹?

Is it possible to create a folder using CFSTR_FILEDESCRIPTOR drag and drop?

我有一个可以使用 CFSTR_FILEDESCRIPTORCFSTR_FILECONTENTS 拖放的有效实现,基于 Raymond Chens 博客中的“What a drag”系列:

https://devblogs.microsoft.com/oldnewthing/tag/what-a-drag

将一个或多个不存在的文件粘贴到任何资源管理器中效果很好window。

接下来我想要实现的是粘贴整个文件树,例如两个文件和一个包含另一个文件的文件夹。

CFSTR_FILEDESCRIPTOR 剪贴板格式是否可行?如果没有,还有其他选择吗?

也许是 TYMED_ISTORAGE 中等格式的东西? (目前的解决方案只是使用TYMED_HGLOBAL。)

当然我可以在某处创建一个临时文件夹并在那里创建我的目录树。我还必须清理这个临时文件夹,这感觉很糟糕。 (我认为这就是 7-Zip 所做的。)

正如 Denis 所写,可以通过将 FILE_ATTRIBUTE_DIRECTORY 传递给 dwFileAttributes(当在 dwFlags 中设置 FD_ATTRIBUTES 时)来创建一个空文件夹。

当您不需要空目录时,可以使用更简单的方法来获取文件夹。只需在 cFileName 成员中包含一个相对路径。

例如,如果文件描述符包含:

  • foo\bar
  • foo\baz

Explorer 将创建一个 foo 文件夹,其中包含两个文件。

此解决方案有一个缺点:cFileName 成员最多只能有 PATH_MAX - 1 个字符长,因此这不适用于深层嵌套结构或具有长文件名的结构。