Archiviazione Compound File
lxCompoundFile legge e scrive contenitori Compound File Binary tramite stream Pascal, compresi ambiti di storage annidati, payload MiniFAT e settori DIFAT concatenati; le API native del workbook Classic BIFF8 usano questo backend su Linux e macOS
Per il lavoro sui fogli elettronici usa le normali chiamate Open e SaveAs del workbook; le API di livello più basso mostrate sotto sono utili per ispezionare stream annidati, costruire contenitori e preservare i metadati di storage
Leggere o costruire un contenitore
TlxCompoundFile.LoadFromStream(AStream, AOwnsStream) carica i metadati di directory e allocazione; AOwnsStream vale False per impostazione predefinita, e lo stream sottostante deve restare disponibile mentre se ne estraggono i contenuti
CreateNew(AStream, AOwnsStream) prepara un nuovo contenitore, AddStorage e AddStream ne accodano i contenuti, e Save scrive un contenitore versione 3 con gli eventuali settori di estensione DIFAT richiesti
| Membro | Comportamento |
|---|---|
RootIndex | L'identità della voce di directory radice, usata come genitore per storage e stream di primo livello |
AddStorage(Name, ParentIndex) | Accoda uno storage annidato e restituisce la sua identità di directory per aggiungere figli |
AddStream(Name, Data) | Accoda uno stream di byte a livello radice |
AddStream(Name, Data, ParentIndex) | Accoda uno stream di byte nell'ambito genitore selezionato e restituisce la sua identità |
OpenStream(Name), OpenStream(Name, ParentIndex) | Estraggono uno stream radice o di ambito in un TlxCfbStream di proprietà; uno stream mancante restituisce nil |
OpenEntryStream(Index) | Estrae lo stream di una voce di directory per identità; una voce non valida o non-stream restituisce nil |
HasStream(Name), HasStream(Name, ParentIndex) | Verificano la presenza dello stream nella radice o nell'ambito genitore selezionato |
FindStorage(Name, ParentIndex) | Restituisce l'identità di uno storage nel genitore selezionato, o -1 se non esiste storage corrispondente |
EntryCount, Entries(Index) | Ispezionano le voci di directory caricate; gli indici sono a base zero e devono essere validi |
SetEntryMetadata(Index, Entry) | Copia solo ID di classe, bit di stato e timestamp in una voce in coda valida o nella radice; le identità strutturali e i payload restano invariati |
Il record TlxCfbEntry espone Name, EntryType, StartSector, Size, LeftSibling, RightSibling, Child e il ParentIndex derivato; i collegamenti di directory sono indici, e -1 indica un'identità assente
I suoi campi di metadati sono ClassID, StateBits, CreationTime e ModificationTime; i timestamp conservano i tick FILETIME grezzi dall'epoca UTC del 1601, non una data formattata secondo il locale
TlxCfbEntryType comprende cfbEmpty, cfbStorage, cfbStream e cfbRoot; TlxCfbStream espone Name, Size, Data, Read, Seek e CopyTo
Gli stream estratti possiedono byte scollegati e devono essere liberati dal chiamante; corruzione, catene incomplete, proprietà non valide e grafi ciclici di directory o allocazione vengono rifiutati invece di restituire payload troncati
lxCfbCompareNames(A, B) applica l'ordinamento length-first del Compound File Binary con una mappatura fissa in maiuscolo dei caratteri BMP semplici; i nomi duplicati sono ambiti al loro genitore, e nomi identici in storage annidati separati restano distinti
Interfacce di storage native
Sui target non Windows, lxOLE fornisce l'implementazione delle interfacce di storage richiesta dal caricamento e salvataggio del workbook Classic; le sue IStorage, IStream e IEnumStatStg conservano una proprietà esplicita delle interfacce e lo stato nativo scollegato del contenitore
| Factory o helper | Contratto |
|---|---|
XlsOpenCompoundStorage(Source, Storage) | Carica un contenitore in sola lettura a partire dall'offset zero dello stream |
XlsOpenCompoundStorage(Source, Start, Storage) | Carica il contenitore a partire dall'offset esplicito non negativo |
XlsCreateCompoundStorage(Storage) | Crea uno storage nativo scrivibile con ambiti e stream annidati |
XlsWriteCompoundStorage(Storage, Destination) | Serializza lo storage radice nativo sullo stream fornito; implementazioni estranee e storage non radice vengono rifiutati |
XlsFreeCompoundStorageName(Name) | Libera i nomi nativi restituiti da statistiche o enumerazione dello storage; nil è accettato |
Le factory restituiscono un HResult; verifica Succeeded(Result) prima di usare l'interfaccia restituita, e rilascia i riferimenti alle interfacce quando hai finito
La mutazione in sola lettura fallisce, i cursori di stream clonati conservano posizioni indipendenti, e le copie annidate preservano l'identità del genitore e i metadati supportati; la serializzazione diretta non fornisce il contratto transazionale di destinazione del workbook di livello superiore
Identificatori canonici del workbook
XlsIdentifierKeyText(const A: WideString): WideString in lxStandard restituisce la rappresentazione testuale UTF-16 della chiave di identificatore Unicode fissa esistente, permettendo allo storage dei nomi definiti Classic di condividere l'uguaglianza canonica con gli altri motori di workbook
Questa rappresentazione di chiave serve per identità e lookup, non per l'ortografia mostrata; i nomi creati restano invariati, e il comparatore di directory CFB conserva il proprio ordinamento separato imposto dal formato
Vedi il supporto Free Pascal per i requisiti di build nativi e il contratto verificato del workbook BIFF8, e la crittografia Classic per il comportamento supportato di crittografia e property-stream in chiaro