.net 如何将修改后的COM结构化存储文件写入磁盘?

.net 如何将修改后的COM结构化存储文件写入磁盘?,.net,com,file-io,interop,structured-storage,.net,Com,File Io,Interop,Structured Storage,我已经实现了一个COM结构的存储文件读取器,它可以打开存储和流对象,这很好。但现在我希望能够将内容从一个存档复制到另一个存档,重命名内容,然后将内容写回磁盘。我甚至还没有处理复制和重命名操作,因为我甚至无法将更改写入磁盘。我尝试调用根IStorage对象的Commit方法,它似乎运行良好,但没有看到任何更改。我是通过C#NET中的PInvoke实现的。以下是适用的代码元素: public void Load(string path) { STATSTG[] storage

我已经实现了一个COM结构的存储文件读取器,它可以打开存储和流对象,这很好。但现在我希望能够将内容从一个存档复制到另一个存档,重命名内容,然后将内容写回磁盘。我甚至还没有处理复制和重命名操作,因为我甚至无法将更改写入磁盘。我尝试调用根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;
        }
    }

我不知道p/Invoke是否是您项目的设计请求,但如果不是,并且您需要快速解决方案,您可以尝试使用我的免费开源库来读取/写入结构化存储文件

它不使用p/Invoke作为100%的C#.net实现