2010-04-02 3 views
0

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

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

ответ

2

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

Он не использует P/Invoke, являющийся реализацией 100% C# .net.

Смежные вопросы