Stockage en fichier composé
lxCompoundFile lit et écrit des conteneurs Compound File Binary via des streams Pascal, y compris des portées de stockage imbriquées, des payloads MiniFAT et des secteurs DIFAT chaînés ; les API natives de classeurs Classic BIFF8 utilisent ce backend sur Linux et macOS
Pour le travail sur des feuilles de calcul, utilisez les appels ordinaires Open et SaveAs du classeur ; les API de plus bas niveau ci-dessous servent à inspecter des streams imbriqués, construire des conteneurs et préserver les métadonnées de stockage
Lire ou construire un conteneur
TlxCompoundFile.LoadFromStream(AStream, AOwnsStream) charge les métadonnées de répertoire et d'allocation ; AOwnsStream vaut False par défaut, et le stream sous-jacent doit rester disponible pendant l'extraction de son contenu
CreateNew(AStream, AOwnsStream) prépare un nouveau conteneur, AddStorage et AddStream mettent son contenu en file d'attente, et Save écrit un conteneur de version 3 avec les secteurs d'extension DIFAT nécessaires
| Membre | Comportement |
|---|---|
RootIndex | Identité de l'entrée du répertoire racine, utilisée comme parent pour le stockage et les streams de premier niveau |
AddStorage(Name, ParentIndex) | Met en file un stockage imbriqué et renvoie son identité de répertoire pour y ajouter des enfants |
AddStream(Name, Data) | Met en file un stream d'octets au niveau racine |
AddStream(Name, Data, ParentIndex) | Met en file un stream d'octets dans la portée parente choisie et renvoie son identité |
OpenStream(Name), OpenStream(Name, ParentIndex) | Extrait un stream racine ou de portée vers un TlxCfbStream détenu ; un stream absent renvoie nil |
OpenEntryStream(Index) | Extrait un stream de répertoire par identité ; une entrée invalide ou non stream renvoie nil |
HasStream(Name), HasStream(Name, ParentIndex) | Teste la présence d'un stream dans la racine ou la portée parente choisie |
FindStorage(Name, ParentIndex) | Renvoie une identité de stockage dans le parent choisi, ou -1 si aucun stockage correspondant n'existe |
EntryCount, Entries(Index) | Inspecte les entrées de répertoire chargées ; les index sont en base zéro et doivent être valides |
SetEntryMetadata(Index, Entry) | Ne copie que l'ID de classe, les bits d'état et les horodatages dans une entrée en file valide ou la racine ; les identités structurelles et les payloads restent inchangés |
L'enregistrement TlxCfbEntry expose Name, EntryType, StartSector, Size, LeftSibling, RightSibling, Child et le ParentIndex dérivé ; les liens de répertoire sont des index, et -1 signale une identité absente
Ses champs de métadonnées sont ClassID, StateBits, CreationTime et ModificationTime ; les horodatages conservent les ticks FILETIME bruts depuis l'époque UTC du 1er janvier 1601 plutôt qu'une date formatée selon la locale
TlxCfbEntryType comprend cfbEmpty, cfbStorage, cfbStream et cfbRoot ; TlxCfbStream expose Name, Size, Data, Read, Seek et CopyTo
Les streams extraits possèdent des octets détachés et doivent être libérés par l'appelant ; corruption, chaînes incomplètes, possession invalide et graphes de répertoire ou d'allocation cycliques sont rejetés au lieu de renvoyer des payloads tronqués
lxCfbCompareNames(A, B) applique le tri Compound File Binary par longueur d'abord avec un mappage fixe en majuscules BMP simples ; les noms dupliqués sont scoped à leur parent, et des noms identiques dans des stockages imbriqués distincts restent différents
Interfaces de stockage natives
Sur les cibles non Windows, lxOLE fournit l'implémentation de l'interface de stockage exigée par le chargement et l'enregistrement des classeurs Classic ; ses IStorage, IStream et IEnumStatStg conservent une possession d'interface explicite et un état de conteneur natif détaché
| Factory ou helper | Contrat |
|---|---|
XlsOpenCompoundStorage(Source, Storage) | Charge un conteneur en lecture seule à partir de l'offset zéro du stream |
XlsOpenCompoundStorage(Source, Start, Storage) | Charge le conteneur à partir de l'offset explicite non négatif |
XlsCreateCompoundStorage(Storage) | Crée un stockage natif inscriptible avec des portées et des streams imbriqués |
XlsWriteCompoundStorage(Storage, Destination) | Sérialise le stockage racine natif vers le stream fourni ; les implémentations étrangères et un stockage non racine sont rejetés |
XlsFreeCompoundStorageName(Name) | Libère les noms natifs renvoyés par les statistiques ou l'énumération de stockage ; nil est accepté |
Les factory renvoient un HResult ; testez Succeeded(Result) avant d'utiliser l'interface renvoyée, et libérez les références d'interface une fois terminé
Une mutation en lecture seule échoue, les curseurs de stream clonés gardent des positions indépendantes, et les copies imbriquées préservent l'identité parente et les métadonnées prises en charge ; la sérialisation directe n'offre pas le contrat de transaction de destination des classeurs de plus haut niveau
Identifiants canoniques de classeur
XlsIdentifierKeyText(const A: WideString): WideString dans lxStandard renvoie la représentation texte UTF-16 de la clé d'identifiant Unicode épinglée existante, ce qui permet au stockage des noms définis Classic de partager l'égalité canonique avec les autres moteurs de classeurs
Cette représentation de clé sert à l'identité et à la recherche, pas à l'orthographe affichée ; les noms saisis restent inchangés, et le comparateur de répertoires CFB conserve son propre ordre imposé par le format
Voir le support de Free Pascal pour les exigences de build natif et le contrat vérifié des classeurs BIFF8, et le chiffrement Classic pour le comportement du chiffrement pris en charge et du property-stream en clair