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