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 APIs nativas de libros Classic BIFF8 usan este backend en Linux y macOS
Para el trabajo con hojas de cálculo use las llamadas ordinarias Open y SaveAs del libro; las APIs de nivel más bajo que aparecen 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 de asignación; AOwnsStream tiene False como valor predeterminado, y el stream de respaldo debe permanecer disponible mientras se extrae su contenido
CreateNew(AStream, AOwnsStream) prepara un contenedor nuevo, AddStorage y AddStream ponen en cola su contenido, y Save escribe un contenedor versión 3 con los sectores de extensión DIFAT requeridos
| Miembro | Comportamiento |
|---|---|
RootIndex | La identidad de la entrada del directorio raíz, usada como padre para los almacenamientos y streams de nivel superior |
AddStorage(Name, ParentIndex) | Pone en cola un almacenamiento anidado y devuelve su identidad de directorio para agregar hijos |
AddStream(Name, Data) | Pone en cola un stream de bytes de nivel raíz |
AddStream(Name, Data, ParentIndex) | Pone en cola 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 a un TlxCfbStream de su propiedad; un stream ausente devuelve nil |
OpenEntryStream(Index) | Extrae un stream de directorio por identidad; una entrada inválida o que no sea 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 un almacenamiento coincidente |
EntryCount, Entries(Index) | Inspeccionan las entradas del directorio cargado; los índices están basados en cero y deben ser válidos |
SetEntryMetadata(Index, Entry) | Copia solo el ID de clase, los bits de estado y las marcas de tiempo a una entrada en cola válida o a 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 del 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 inválida y los grafos de directorio o de asignación cíclicos provocan rechazo en lugar de devolver cargas truncadas
lxCfbCompareNames(A, B) aplica el ordenamiento de Compound File Binary por longitud primero, 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 separados permanecen distintos
Interfaces de almacenamiento nativas
En los destinos que no son Windows, lxOLE aporta la implementación de la interfaz de almacenamiento que la carga y el guardado de libros Classic requieren; sus IStorage, IStream y IEnumStatStg conservan la propiedad explícita de interfaces y el estado nativo desacoplado del contenedor
| Fábrica o ayuda | Contrato |
|---|---|
XlsOpenCompoundStorage(Source, Storage) | Carga un contenedor de solo lectura comenzando en el desplazamiento cero del stream |
XlsOpenCompoundStorage(Source, Start, Storage) | Carga el contenedor comenzando en el desplazamiento 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 aportado; las implementaciones ajenas y el almacenamiento que no sea raíz provocan rechazo |
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; pruebe Succeeded(Result) antes de usar la interfaz devuelta, y libere las referencias de interfaz al terminar
La mutación de 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 fijada existente, lo que permite que el almacenamiento de nombres definidos Classic comparta igualdad canónica con los demás motores de libros
Esta representación de clave es para identidad y búsqueda, no para la ortografía mostrada; los nombres escritos permanecen sin cambios, y el comparador de directorios CFB conserva su ordenamiento separado exigido por el formato
Consulte el soporte de Free Pascal para conocer los requisitos de compilación nativa y el contrato verificado de libros BIFF8, y el cifrado Classic para conocer el comportamiento admitido de cifrado y de streams de propiedades en texto plano