如何将 IPropertyBag 持久化到磁盘

Posted

技术标签:

【中文标题】如何将 IPropertyBag 持久化到磁盘【英文标题】:How to persist an IPropertyBag to disk 【发布时间】:2020-10-08 20:47:18 【问题描述】:

我已经成功获得了一个IPropertyBag 用于文件夹的视图状态。我是使用SHGetViewStatePropertyBag 获得的,我通过检查一些属性值确认了这个包是有效的。

如果可能的话,我现在想做的是将属性包作为 blob 保存到磁盘。我一直在包上运行QueryInterface,但我一直无法获得任何有用的接口。不幸的是,属性包似乎不支持IPersistStream 接口。而且我也没有成功查询到IPersistPropertyBag接口。

为属性包获取某种持久接口是否有技巧?还是本质上必须以临时方式单独保存属性?提前感谢您的任何指导。

【问题讨论】:

如果没有持久化接口,或者 IPropertBag2::Write 没有实现,这意味着它是一个只读包(Shell 不希望你这样做并破坏它的东西)。我不知道我们可以重用的任何内置 IPersistPropertyBag(2) 实现。因此,您必须枚举属性并以您喜欢的方式保存/读取它们。 好的,非常感谢。 IPersistStreamInit 怎么样?它与 IPersistStream 非常相似,但实际上并不是从 IPersistStream 派生的。如果所有其他方法都失败了,您可能会查询 IProvideClassInfo 并写出 ITypeInfo(我知道这将是一个 PITA,但如果实施它可能会让您更好地了解实际可用的接口)。 @SornelHaetir 谢谢,但IPersistStreamInit 没用。 【参考方案1】:

IPropertyBag 上调用Write 应该会自动将更改写入磁盘。

一般来说,IPersistXXX 接口是由可以将自己保存到 XXX 中的对象实现的(其中 XXX 是 Stream 或 PropertyBag),同时 IPropertyBagIStream 预计会有一些东西支持 - 磁盘或内存块或套接字。

或者确实想从包中取出所有属性并以某种方式将它们保存在其他地方?在这种情况下,您需要查询 IPropertyBag2 并枚举它们。

【讨论】:

是的,澄清一下,我的意思是我想把包保存在别处,理想情况下只是一个斑点。我应该澄清一下。不幸的是,IPropertyBag2 没有被包实现。我认为你可以获取接口,但方法没有实现。 更大的背景是什么?你首先想做什么? 我正在尝试实现一项功能,该功能允许用户按名称保存当前文件夹布局(列、排序顺序等),然后根据需要将该布局应用于其他文件夹。 我会追求什么,获得IShellFolderIShelLFolderView,看看其中一个 是否支持IPersistPropertyBag,实现你自己的IPropertyBag 并告诉要保存到 that. 的文件夹对象 我正在尝试这种方法。你知道如何创建一个空的属性包用于IPersistPropertyBag吗?

以上是关于如何将 IPropertyBag 持久化到磁盘的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据持久保存到磁盘,并随机更新它,并将其有效地流式传输回 RAM?

使用ehcache持久化数据到磁盘 并且在应用服务器重启后不丢失数据

如何将 android 应用程序数据持久保存到本地 sql server

为啥核心数据不会持久化到磁盘?

记忆到磁盘 - python - 持久记忆

Redis笔记4-持久化方案