Хранилище Compound File
lxCompoundFile читает и пишет контейнеры Compound File Binary через Pascal-потоки, включая вложенные области хранения, полезную нагрузку MiniFAT и цепочки секторов DIFAT; нативные Classic API книги BIFF8 используют этот backend на Linux и macOS
Для работы с электронными таблицами используйте обычные вызовы книги Open и SaveAs; низкоуровневые API ниже полезны для инспекции вложенных потоков, сборки контейнеров и сохранения метаданных хранилища
Чтение или сборка контейнера
TlxCompoundFile.LoadFromStream(AStream, AOwnsStream) загружает метаданные каталога и аллокаций; AOwnsStream по умолчанию False, и базовый поток должен оставаться доступным, пока вы извлекаете его содержимое
CreateNew(AStream, AOwnsStream) готовит новый контейнер, AddStorage и AddStream ставят его содержимое в очередь, а Save записывает контейнер версии 3 с необходимыми секторами расширения DIFAT
| Элемент | Поведение |
|---|---|
RootIndex | Идентичность корневой записи каталога, используется как родитель для хранилищ и потоков верхнего уровня |
AddStorage(Name, ParentIndex) | Ставит вложенное хранилище в очередь и возвращает его идентичность в каталоге для добавления дочерних элементов |
AddStream(Name, Data) | Ставит в очередь поток байтов на корневом уровне |
AddStream(Name, Data, ParentIndex) | Ставит в очередь поток байтов в выбранной родительской области и возвращает его идентичность |
OpenStream(Name), OpenStream(Name, ParentIndex) | Извлекают корневой или областной поток в собственный TlxCfbStream; отсутствующий поток возвращает nil |
OpenEntryStream(Index) | Извлекает поток каталога по идентичности; неверная запись или запись, не являющаяся потоком, возвращает nil |
HasStream(Name), HasStream(Name, ParentIndex) | Проверяют наличие потока в корне или выбранной родительской области |
FindStorage(Name, ParentIndex) | Возвращает идентичность хранилища в выбранном родителе или -1, если подходящего хранилища нет |
EntryCount, Entries(Index) | Позволяют осмотреть загруженные записи каталога; индексы отсчитываются от нуля и должны быть корректными |
SetEntryMetadata(Index, Entry) | Копирует только class ID, биты состояния и метки времени в корректную запись в очереди или корень; структурные идентичности и полезная нагрузка остаются без изменений |
Запись TlxCfbEntry предоставляет Name, EntryType, StartSector, Size, LeftSibling, RightSibling, Child и вычисляемый ParentIndex; ссылки каталога — это индексы, а -1 обозначает отсутствие идентичности
Поля её метаданных — ClassID, StateBits, CreationTime и ModificationTime; метки времени сохраняют исходные тики FILETIME от эпохи 1601 UTC, а не дату в локальном формате
TlxCfbEntryType включает cfbEmpty, cfbStorage, cfbStream и cfbRoot; TlxCfbStream предоставляет Name, Size, Data, Read, Seek и CopyTo
Извлечённые потоки владеют отсоединёнными байтами и должны освобождаться вызывающим кодом; повреждения, неполные цепочки, неверное владение и циклические графы каталога или аллокаций приводят к отказу, а не к усечённой полезной нагрузке
lxCfbCompareNames(A, B) применяет упорядочение Compound File Binary «сначала длина» с закреплённым отображением простых BMP-символов в верхний регистр; дубликаты имён ограничены своим родителем, и одинаковые имена в отдельных вложенных хранилищах остаются различными
Нативные интерфейсы хранилища
На не-Windows целевых платформах lxOLE поставляет реализацию интерфейса хранилища, необходимую Classic-загрузке и сохранению книги; его IStorage, IStream и IEnumStatStg сохраняют явное владение интерфейсами и отсоединённое нативное состояние контейнера
| Фабрика или хелпер | Контракт |
|---|---|
XlsOpenCompoundStorage(Source, Storage) | Загружает контейнер только для чтения, начиная со смещения ноль в потоке |
XlsOpenCompoundStorage(Source, Start, Storage) | Загружает контейнер, начиная с явно заданного неотрицательного смещения |
XlsCreateCompoundStorage(Storage) | Создаёт записываемое нативное хранилище с вложенными областями и потоками |
XlsWriteCompoundStorage(Storage, Destination) | Сериализует нативное корневое хранилище в указанный поток; чужие реализации и не-корневое хранилище отклоняются |
XlsFreeCompoundStorageName(Name) | Освобождает нативные имена, возвращённые статистикой или перечислением хранилища; nil допустим |
Фабрики возвращают HResult; проверьте Succeeded(Result) перед использованием возвращённого интерфейса и освобождайте ссылки на интерфейсы по завершении
Изменение read-only хранилища завершается неудачей, клонированные курсоры потоков хранят независимые позиции, а вложенные копии сохраняют родительскую идентичность и поддерживаемые метаданные; прямая сериализация не даёт контракта транзакции назначения более высокого уровня для книги
Канонические идентификаторы книги
XlsIdentifierKeyText(const A: WideString): WideString в lxStandard возвращает UTF-16-представление существующего закреплённого ключа Unicode-идентификатора, позволяя хранению определённых имён Classic разделять каноническое равенство с другими движками книги
Это представление ключа нужно для идентичности и поиска, а не для отображаемого написания; авторские имена остаются без изменений, а компаратор каталога CFB хранит своё отдельное предписанное форматом упорядочение
О нативных требованиях сборки и проверенном контракте книги BIFF8 см. поддержку Free Pascal, о поддерживаемом шифровании и поведении потока свойств с открытым текстом — шифрование Classic