Как записать измененный файл структурированного хранилища COM на диск? - PullRequest
0 голосов
/ 02 апреля 2010

У меня реализовано средство чтения файлов структурированного хранилища COM, которое может открывать хранилище и передавать объекты в потоковом режиме. Но теперь я хочу иметь возможность копировать данные из одного архива в другой, переименовывать и записывать их обратно на диск. Я даже не обращался к операциям копирования и переименования, потому что не могу даже записать изменения на диск. Я попытался вызвать метод Commit объекта Root IStorage, и он, кажется, работает нормально, но я не вижу никаких изменений. Я реализую это через PInvoke в C # .NET. Здесь применимы элементы кода:

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;
        }
    }

1 Ответ

2 голосов
/ 19 ноября 2010

Я не знаю, является ли P / Invoke запросом дизайна для вашего проекта, но если это не так, и вам нужно быстрое решение, вы можете попробовать мою бесплатную библиотеку с открытым исходным кодом для чтения / записи файлов структурированного хранилища. OpenMCDF .

Он не использует P / Invoke как 100% -ную реализацию C # .net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...