# Stockage structuré COM

Le stockage structuré COM (COM Structured Storage en anglais, aussi connu sous le nom de OLE structured storage) est une technologie développée par Microsoft pour son système d’exploitation Windows pour stocker des données hiérarchiques dans un seul fichier. Strictement parlant, le terme stockage structuré se réfère à un ensemble d’interfaces COM qu’une implémentation conforme doit fournir, et pas à une mise en œuvre spécifique, ni à un format de fichier spécifique (en fait, une implémentation de stockage structuré n’a pas du tout besoin de stocker les données dans un fichier). En plus de l’apport d’une structure hiérarchique des données, le stockage structuré peut également fournir une forme limitée de support pour les accès aux données.
Le stockage structuré est largement utilisé dans les applications Microsoft Office, ainsi que Microsoft SQL Server, le shell de Windows, et plusieurs programmes de CAO développés par d’autres éditeurs.

## Principe

Le stockage structuré résout certaines difficultés inhérentes au stockage de plusieurs objets de données dans un seul fichier. Une difficulté se pose quand un objet appartenant au fichier change de taille à la suite d'une mise à jour. Si l'application qui est en train de lire/écrire le fichier s’attend à ce que les objets dans le fichier restent dans un certain ordre, tout ce qui suit la représentation de cet objet dans le fichier peut avoir besoin d'être déplacé vers l'arrière pour faire de la place si l'objet s’élargit, ou vers l’avant pour remplir l'espace laissé si l'objet se rétrécit. Si le fichier est grand, cela pourrait être une opération coûteuse. Bien entendu, il existe plusieurs solutions possibles à ce problème, mais souvent les programmeurs d'application ne veulent pas s’occuper des détails de bas niveau comme les formats de fichiers binaires.
Le stockage structuré COM permet de stocker de manière efficace plusieurs types d’objets dans un seul fichier : dans ce seul fichier est défini tout un système de fichier. Ce système de fichier est une collection structurée de 2 types d’objets : des storages (stockages) et des streams (flux) qui jouent le rôle des répertoires et des fichiers. Un stream peut résider dans la RAM, dans un fichier, ou dans un autre stream, etc. Un storage peut contenir des streams, ou d’autres storages.
Lorsqu’un nouvel objet vient s’ajouter dans le fichier, il n’y a pas de réécriture et décalage de plusieurs secteurs du disque. L’objet est simplement écrit dans le premier emplacement disponible, et la table des pointeurs du fichier est mise à jour pour indiquer cet emplacement. Le stockage structuré COM permet à l’utilisateur de voir et de manipuler son fichier comme un simple fichier et non pas une hiérarchie d’objets séparés.
Un fichier composé COM est constitué d’un objet de stockage racine contenant au moins un objet stream et au moins un objet storage. Un objet stream se comporte comme un fichier et contient des données rangées comme une séquence d’octets. Un objet storage se comporte comme un répertoire et renvoie éventuellement aux autres emplacements storages et streams faisant partie du fichier composé COM. L’objet de stockage racine mappe à un nom de fichier, quel que soit le système de fichier dans lequel il est hébergé.
Un fichier composé COM est formé d’un nombre de secteurs de longueurs égales, par exemple 512 octets chacun. Le premier secteur contient l’entête du fichier composé. Les secteurs suivants sont identifiés par un nombre entier de 32 bits, donc chaque fichier composé peut avoir jusqu’à 4.294.967.295 secteurs. Les secteurs à l’intérieur d’un fichier composé peuvent se regrouper en groupes, appelés chaînes de secteurs (sector chain). Les locations physiques des secteurs membres d’une chaîne de secteurs peuvent être parsemées, et les numéros de secteurs d’une chaîne de secteurs peuvent être non contigus. Par exemple on peut avoir une chaîne de secteur regroupant les secteurs 2-3-11-15-16, et une autre chaîne de secteurs regroupant les secteurs 4-5-14.

## Avantages

Le stockage structuré COM permet également les utilisations suivantes :
* Accès incrémentiel : Un utilisateur peut accéder en lecture/écriture à un simple objet à l’intérieur d’un fichier, sans toucher le reste du fichier.
* Multi-utilisateurs : Un fichier composé peut être accessible en même temps par plusieurs utilisateurs et/ou applications en lecture/écriture.
* Mode transaction : Les opérations d’écriture aux fichiers composés peuvent être mises en mémoire tampon, pour être appliquées en une seule fois comme avec la commande commit.
* Mémoire faible : Les fichiers peuvent être sauvegardés dans les situations où il reste peu de mémoire disponible.
* Systèmes de fichiers différents : Les fichiers composés peuvent être stockés sous FAT, NTFS ou Macintosh File System (HFS) et peuvent être ouverts par les applications travaillant avec ces systèmes de fichiers.
* Navigateurs différents : Tout utilitaire navigateur utilisant les interfaces COM standards et APIs peut lister les objets d’un fichier composé, même si les données dans certains objets peuvent être codées dans un format propriétaire.

## Applications

Les applications suivantes utilisent le stockage structuré COM (Compound Document Format) :
* Microsoft Office 97-2003 pour
** Les documents et modèles (.DOC, .DOT) de Word
** Les feuilles et modèles (.XLS, .XLT) d’Excel
** Les présentations et modèles (.PPT, .POT) de PowerPoint
** Les fichiers .PUB de Publisher
** Les fichiers .VSD de Visio
** Les fichiers .MPP de Project
** Les fichiers .MIX de Microsoft PhotoDraw
** Les fichiers .MSG d’Outlook
* Windows Installer avec les fichiers .MSI, .MSP, .MST
* Microsoft Picture It! / Microsoft Digital Image avec les fichiers .MIX
* Internet Explorer RSS avec les fichiers .feed-ms
* Windows 7
** StickyNotes avec les fichiers .SNT
** Les fichiers jump lists
* Les thumbnail caches de Windows (Thumbs.db)
* Les packages DTS de Microsoft SQL Server 2000
* Autodesk Revit
* Autodesk Inventor

## Produits connexes ou concurrents

* OpenDocument
* Pour Microsoft .NET :
** GemBox.CompoundFile - Composant .NET pour lire et écrire les streams individuels et storages dans le format OLE2 Compound Document.
** OpenMCDF - Pour manipuler les fichiers Microsoft Compound Document File Format, licence public MPL.
* Pour Linux:
** GNOME Structured File Library – Peut faire de la lecture et l'écriture de fichiers composés de plusieurs formats, dont celui de Microsoft.
** POLE – Bibliothèque C++ portable pour accéder aux données de stockage structuré.
* Multiplateforme C++ pour Window/MacOSX/Linux:
** POLE - portable library for structured storage.
* Pour Java:
** POIFS –Implémentation Java du format OLE 2 Compound Document, dans le projet Apache POI.