Almacenamiento de archivos compuestos
lxCompoundFile lee y escribe contenedores Compound File Binary a través de streams de Pascal, incluidos los ámbitos de almacenamiento anidados, las cargas MiniFAT y los sectores DIFAT encadenados; las API nativas del libro Classic BIFF8 usan este backend en Linux y macOS
Usa las llamadas ordinarias Open y SaveAs del libro para el trabajo con hojas de cálculo; las API de nivel inferior de abajo son útiles para inspeccionar streams anidados, construir contenedores y preservar metadatos de almacenamiento
Leer o construir un contenedor
TlxCompoundFile.LoadFromStream(AStream, AOwnsStream) carga los metadatos de directorio y asignación; AOwnsStream es False por defecto, y el stream de respaldo debe permanecer disponible mientras se extrae su contenido
CreateNew(AStream, AOwnsStream) prepara un contenedor nuevo, AddStorage y AddStream encolan su contenido, y Save escribe un contenedor de versión 3 con los sectores de extensión DIFAT necesarios
| Miembro | Comportamiento |
|---|---|
RootIndex | La identidad de la entrada del directorio raíz, usada como padre del almacenamiento y los streams de nivel superior |
AddStorage(Name, ParentIndex) | Encola un almacenamiento anidado y devuelve su identidad de directorio para añadir hijos |
AddStream(Name, Data) | Encola un stream de bytes a nivel raíz |
AddStream(Name, Data, ParentIndex) | Encola un stream de bytes en el ámbito padre seleccionado y devuelve su identidad |
OpenStream(Name), OpenStream(Name, ParentIndex) | Extraen un stream raíz o de ámbito en un TlxCfbStream propio; un stream ausente devuelve nil |
OpenEntryStream(Index) | Extrae un stream de directorio por identidad; una entrada no válida o que no es stream devuelve nil |
HasStream(Name), HasStream(Name, ParentIndex) | Comprueban la presencia del stream en la raíz o en el ámbito padre seleccionado |
FindStorage(Name, ParentIndex) | Devuelve una identidad de almacenamiento en el padre seleccionado, o -1 cuando no existe almacenamiento coincidente |
EntryCount, Entries(Index) | Inspeccionan las entradas de directorio cargadas; los índices son de base cero y deben ser válidos |
SetEntryMetadata(Index, Entry) | Copia solo el ID de clase, los bits de estado y las marcas de tiempo en una entrada encolada válida o en la raíz; las identidades estructurales y las cargas permanecen sin cambios |
El registro TlxCfbEntry expone Name, EntryType, StartSector, Size, LeftSibling, RightSibling, Child y el ParentIndex derivado; los enlaces de directorio son índices, y -1 indica una identidad ausente
Sus campos de metadatos son ClassID, StateBits, CreationTime y ModificationTime; las marcas de tiempo conservan los ticks FILETIME crudos de la época UTC de 1601 en lugar de una fecha formateada según la configuración regional
TlxCfbEntryType incluye cfbEmpty, cfbStorage, cfbStream y cfbRoot; TlxCfbStream expone Name, Size, Data, Read, Seek y CopyTo
Los streams extraídos poseen bytes desacoplados y el llamador debe liberarlos; la corrupción, las cadenas incompletas, la propiedad no válida y los grafos de directorio o asignación cíclicos se rechazan en lugar de devolver cargas truncadas
lxCfbCompareNames(A, B) aplica el orden de longitud primero de Compound File Binary con un mapeo fijo a mayúsculas BMP simple; los nombres duplicados tienen el ámbito de su padre, y los nombres idénticos en almacenamientos anidados distintos permanecen diferenciados
Interfaces nativas de almacenamiento
En los destinos que no son Windows, lxOLE aporta la implementación de la interfaz de almacenamiento que requieren la carga y el guardado del libro Classic; sus IStorage, IStream e IEnumStatStg conservan la propiedad explícita de interfaces y el estado nativo desacoplado del contenedor
| Fábrica o helper | Contrato |
|---|---|
XlsOpenCompoundStorage(Source, Storage) | Carga un contenedor de solo lectura empezando en el offset cero del stream |
XlsOpenCompoundStorage(Source, Start, Storage) | Carga el contenedor empezando en el offset explícito no negativo |
XlsCreateCompoundStorage(Storage) | Crea almacenamiento nativo escribible con ámbitos y streams anidados |
XlsWriteCompoundStorage(Storage, Destination) | Serializa el almacenamiento raíz nativo al stream suministrado; las implementaciones ajenas y el almacenamiento no raíz se rechazan |
XlsFreeCompoundStorageName(Name) | Libera los nombres nativos devueltos por las estadísticas o la enumeración del almacenamiento; se acepta nil |
Las fábricas devuelven HResult; comprueba Succeeded(Result) antes de usar la interfaz devuelta, y libera las referencias de interfaz al terminar
La mutación en solo lectura falla, los cursores de stream clonados conservan posiciones independientes, y las copias anidadas preservan la identidad del padre y los metadatos admitidos; la serialización directa no proporciona el contrato de transacción de destino del libro de nivel superior
Identificadores canónicos del libro
XlsIdentifierKeyText(const A: WideString): WideString en lxStandard devuelve la representación de texto UTF-16 de la clave de identificador Unicode fija existente, permitiendo que el almacenamiento de nombres definidos Classic comparta igualdad canónica con los demás motores de libro
Esta representación de clave sirve para identidad y búsqueda, no para la ortografía mostrada; los nombres escritos permanecen sin cambios, y el comparador de directorios CFB retiene su ordenación independiente exigida por el formato
Consulta el soporte de Free Pascal para los requisitos de compilación nativa y el contrato verificado del libro BIFF8, y el cifrado Classic para el comportamiento admitido de cifrado y streams de propiedades en claro