我实现了一个可以打开存储和流对象的COM结构化存储文件阅读器,这一切都很开心。但现在我希望能够将一个存档中的内容复制到另一个存档并重命名,然后将内容写回磁盘。我甚至没有解决复制和重命名操作,因为我似乎甚至无法将更改写入磁盘。我尝试调用Root IStorage对象的Commit方法,它似乎运行正常,但我看不到任何更改。我是通过C#.NET中的PInvoke实现的。以下是适用的代码元素:
public void Load(string path)
{
STATSTG[] storageElementInfos = new STATSTG[1];
// Populate our storage object
var result = StgOpenStorage(path, null, STGM.DIRECT | STGM.READWRITE | STGM.SHARE_EXCLUSIVE, IntPtr.Zero, 0, out archive);
// Only proceed if we succeed in populating our SS object
if (result == 0)
{
uint count;
IEnumSTATSTG elements;
archive.EnumElements(0, IntPtr.Zero, 0, out elements);
elements.Next(1, storageElementInfos, out count);
if (count != 0)
{
if ((STGTY)storageElementInfos[0].type == STGTY.STGTY_STORAGE)
{
//create Root Here
var root = storageElementInfos[0];
Root = new StructuredStorageContainer();
Root.element = root;
(Root as StructuredStorageContainer).Load(archive);
}
}
}
}
public void Save()
{
if (Root is StructuredStorageContainer)
{
(Root as StructuredStorageContainer).Save();
}
archive.Commit(0);
}
进行更改
ListArchive((archive.Root as StructuredStorageContainer), 0);
archive.Root.Name = "Fail";
archive.Save();
StructuredStorageNode类的名称定义。
internal System.Runtime.InteropServices.ComTypes.STATSTG element;
public string Name
{
get
{
return element.pwcsName;
}
set
{
element.pwcsName = value;
}
}
答案 0 :(得分:2)
我不知道P / Invoke是否是您项目的设计请求,但如果不是,并且您需要快速解决方案,您可以尝试使用我的免费开源库来读取/写入结构化存储文件OpenMCDF。
它不使用P / Invoke作为100%C#.net实现。