Armazenamento de arquivo composto
lxCompoundFile lê e grava contêineres Compound File Binary por meio de streams Pascal, incluindo escopos de armazenamento aninhados, payloads de MiniFAT e setores DIFAT encadeados; as APIs nativas de pasta de trabalho Classic BIFF8 usam esse backend no Linux e no macOS
Para trabalho com planilhas, use as chamadas comuns Open e SaveAs da pasta de trabalho; as APIs de nível mais baixo abaixo são úteis para inspecionar streams aninhados, construir contêineres e preservar metadados de armazenamento
Ler ou construir um contêiner
TlxCompoundFile.LoadFromStream(AStream, AOwnsStream) carrega metadados de diretório e de alocação; AOwnsStream tem False como padrão, e o stream de suporte deve permanecer disponível durante a extração do conteúdo dele
CreateNew(AStream, AOwnsStream) prepara um novo contêiner, AddStorage e AddStream enfileiram o conteúdo dele, e Save grava um contêiner da versão 3 com os setores de extensão DIFAT necessários
| Membro | Comportamento |
|---|---|
RootIndex | A identidade da entrada de diretório raiz, usada como pai de armazenamentos e streams de nível superior |
AddStorage(Name, ParentIndex) | Enfileira um armazenamento aninhado e retorna a identidade de diretório dele para adicionar filhos |
AddStream(Name, Data) | Enfileira um stream de bytes no nível raiz |
AddStream(Name, Data, ParentIndex) | Enfileira um stream de bytes no escopo pai selecionado e retorna a identidade dele |
OpenStream(Name), OpenStream(Name, ParentIndex) | Extraem um stream raiz ou com escopo para um TlxCfbStream próprio; um stream ausente retorna nil |
OpenEntryStream(Index) | Extrai um stream de diretório pela identidade; uma entrada inválida ou que não é stream retorna nil |
HasStream(Name), HasStream(Name, ParentIndex) | Testam a presença do stream na raiz ou no escopo pai selecionado |
FindStorage(Name, ParentIndex) | Retorna uma identidade de armazenamento no pai selecionado, ou -1 quando não existe armazenamento correspondente |
EntryCount, Entries(Index) | Inspecionam as entradas de diretório carregadas; os índices têm base zero e devem ser válidos |
SetEntryMetadata(Index, Entry) | Copia apenas ID de classe, bits de estado e timestamps para uma entrada enfileirada válida ou para a raiz; identidades estruturais e payloads permanecem inalterados |
O record TlxCfbEntry expõe Name, EntryType, StartSector, Size, LeftSibling, RightSibling, Child e o ParentIndex derivado; os links de diretório são índices, e -1 indica uma identidade ausente
Os campos de metadados dele são ClassID, StateBits, CreationTime e ModificationTime; os timestamps retêm ticks FILETIME brutos da época UTC de 1601 em vez de uma data formatada por localidade
TlxCfbEntryType inclui cfbEmpty, cfbStorage, cfbStream e cfbRoot; TlxCfbStream expõe Name, Size, Data, Read, Seek e CopyTo
Os streams extraídos são donos de bytes desanexados e devem ser liberados pelo chamador; corrupção, cadeias incompletas, propriedade inválida e grafos cíclicos de diretório ou alocação são rejeitados em vez de retornar payloads truncados
lxCfbCompareNames(A, B) aplica a ordenação de Compound File Binary com comprimento primeiro e mapeamento fixo de maiúsculas BMP simples; nomes duplicados têm escopo do pai, e nomes idênticos em armazenamentos aninhados separados permanecem distintos
Interfaces de armazenamento nativas
Em destinos não Windows, lxOLE fornece a implementação da interface de armazenamento exigida pelo carregamento e salvamento de pastas de trabalho Classic; IStorage, IStream e IEnumStatStg retêm a propriedade explícita de interface e o estado nativo desanexado do contêiner
| Fábrica ou helper | Contrato |
|---|---|
XlsOpenCompoundStorage(Source, Storage) | Carrega um contêiner somente leitura começando no offset zero do stream |
XlsOpenCompoundStorage(Source, Start, Storage) | Carrega o contêiner começando no offset explícito não negativo |
XlsCreateCompoundStorage(Storage) | Cria armazenamento nativo gravável com escopos e streams aninhados |
XlsWriteCompoundStorage(Storage, Destination) | Serializa o armazenamento raiz nativo para o stream fornecido; implementações de terceiros e armazenamento não raiz são rejeitados |
XlsFreeCompoundStorageName(Name) | Libera nomes nativos retornados por estatísticas ou enumeração de armazenamento; nil é aceito |
As fábricas retornam HResult; teste Succeeded(Result) antes de usar a interface retornada e libere as referências de interface ao terminar
Mutação somente leitura falha, cursores de stream clonados retêm posições independentes, e cópias aninhadas preservam a identidade do pai e os metadados com suporte; a serialização direta não fornece o contrato de transação de destino de pasta de trabalho de nível mais alto
Identificadores canônicos de pasta de trabalho
XlsIdentifierKeyText(const A: WideString): WideString em lxStandard retorna a representação de texto UTF-16 da chave de identificador Unicode fixada existente, permitindo que o armazenamento de nomes definidos Classic compartilhe igualdade canônica com outros motores de pasta de trabalho
Essa representação de chave é para identidade e procura, e não para a grafia exibida; os nomes criados permanecem inalterados, e o comparador de diretório CFB retém sua ordenação separada exigida pelo formato
Consulte o suporte a Free Pascal para os requisitos de build nativo e o contrato verificado de pasta de trabalho BIFF8, e a criptografia Classic para os comportamentos de criptografia com suporte e de property-stream em texto puro