2010-04-02 11 views
0

J'ai un lecteur de fichier de stockage structuré COM implémenté qui peut ouvrir des objets de stockage et de flux, tout est heureux. Mais maintenant je veux être capable de copier des choses d'une archive à l'autre et de renommer des choses, puis d'écrire des choses sur le disque. Je n'ai même pas adressé les opérations de copie et de renommer parce que je ne peux pas sembler écrire même des changements sur le disque. J'ai essayé d'appeler la méthode Commit de l'objet IStorage racine et cela semble fonctionner correctement, mais je ne vois aucun changement. Je l'implémente via PInvoke dans C# .NET. Voici les éléments de code applicables:Comment écrire un fichier COM Structured Storage modifié sur le disque?

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

faire le changement

 ListArchive((archive.Root as StructuredStorageContainer), 0); 
     archive.Root.Name = "Fail"; 
     archive.Save(); 

La définition du nom de la classe StructuredStorageNode.

internal System.Runtime.InteropServices.ComTypes.STATSTG element; 
    public string Name 
    { 
     get 
     { 
      return element.pwcsName; 
     } 
     set 
     { 
      element.pwcsName = value; 
     } 
    } 

Répondre

2

Je ne sais pas si P/Invoke est une conception demande de votre projet, mais si ce n'est pas et vous besoin d'une solution rapide, vous pouvez donner un essai à ma bibliothèque libre et open source pour la lecture/écriture de fichiers de stockage structuré OpenMCDF.

Il n'utilise pas P/Invoke étant une implémentation 100% C# .net.