【问题标题】:How to create an IShellItemArray from a list of file names如何从文件名列表创建 IShellItemArray
【发布时间】:2012-01-11 13:10:13
【问题描述】:

您能告诉我如何使用IFileOperation::DeleteItems 删除多个文件吗?

我无法使用文件名构建 IShellItemArray

【问题讨论】:

  • 使用双零结尾的文件列表调用 SHFileOperation 容易得多。
  • SHFileOperation 在 Windows 7 中已弃用
  • SHFileOperation 仍然可以正常工作。如果您不需要IFileOperation 的新奇特性,那么SHFileOperation 更容易。我想你知道IFileOperation 在 XP 上不可用。
  • 如果你真的想用IFileOperation::DeleteItems来做,你的选项列在the documentation中。在这种情况下最简单的可能是SHCreateShellItemArrayFromIDLists。从ILCreateFromPath 获取 ID 列表。第二个选择是SHCreateShellItemArrayFromDataObject,其中您的数据对象包含CF_HDROP。但听起来您对操作 shell 命名空间并不十分熟悉。你应该先熟悉一下。 Shell 项和项数组以及 ID 列表非常基础。
  • 我知道 IFileOperation 在 XP 上不可用,但我想使用 IFileOperation,但我不知道如何从文件名列表中构建 IShellItemArray。

标签: c++ winapi shell windows-7 sdk


【解决方案1】:

【讨论】:

  • 查看我对原始问题的评论。 "从ILCreateFromPath 获取 ID 列表。"但是,如果您正在为 shell 项和 ID 列表而苦苦挣扎,我认为您应该退后一步,熟悉基础知识,然后再深入研究文件操作等高级内容。这样你就会知道诸如“我何时以及如何释放这段内存?”之类的事情。
【解决方案2】:

我解决了同样的问题。我创建了一个向量类型的变量(用于保存我所有的 IShellItem),并使用 for 循环将每个文件名(也是向量)转换为 IShellItem 对象,并将它们保存在 IShellItem 容器中。 然后我遍历这个 IShellItem 容器,将每个项目提供给 CopyItem()。 在循环之后,我调用了 PerformOpeations()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多