コンパウンド ファイル ストレージ
lxCompoundFile は、Pascal ストリームを通じて Compound File Binary コンテナを読み書きします。ネストしたストレージ スコープ、MiniFAT ペイロード、連鎖する DIFAT セクタも扱います。Linux と macOS のネイティブ Classic BIFF8 ワークブック API はこのバックエンドを使用します
表計算の作業には通常のワークブックの Open と SaveAs 呼び出しを使ってください。以下の低レベル API は、ネストしたストリームの検査、コンテナの構築、ストレージ メタデータの保持に役立ちます
コンテナの読み取りと構築
TlxCompoundFile.LoadFromStream(AStream, AOwnsStream) はディレクトリとアロケーションのメタデータを読み込みます。AOwnsStream のデフォルトは False で、内容を取り出している間、基盤ストリームは利用可能なままにしておく必要があります
CreateNew(AStream, AOwnsStream) が新しいコンテナを準備し、AddStorage と AddStream が内容をキューに入れ、Save が必要な DIFAT 拡張セクタ付きのバージョン 3 コンテナを書き出します
| メンバー | 動作 |
|---|---|
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) | クラス ID、状態ビット、タイムスタンプだけを、キュー内の有効なエントリまたはルートへコピーします。構造的な識別子とペイロードは変わりません |
TlxCfbEntry レコードは Name、EntryType、StartSector、Size、LeftSibling、RightSibling、Child と派生の ParentIndex を公開します。ディレクトリ リンクはインデックスで、-1 は対応する識別子がないことを示します
メタデータ フィールドは ClassID、StateBits、CreationTime、ModificationTime です。タイムスタンプはロケール書式の日付ではなく、1601 年 UTC エポックからの生の FILETIME 刻み値を保持します
TlxCfbEntryType には cfbEmpty、cfbStorage、cfbStream、cfbRoot があります。TlxCfbStream は Name、Size、Data、Read、Seek、CopyTo を公開します
取り出したストリームは切り離されたバイト列を所有するため、呼び出し側が解放する必要があります。破損、不完全なチェーン、無効な所有関係、循環するディレクトリやアロケーション グラフは、切り詰められたペイロードを返す代わりに拒否します
lxCfbCompareNames(A, B) は、固定された単純 BMP 大文字マッピングによる Compound File Binary の長さ優先順序を適用します。重複する名前は親をスコープとし、別々のネスト ストレージにある同一の名前は区別されたままです
ネイティブ ストレージ インターフェース
非 Windows ターゲットでは、lxOLE が Classic ワークブックの読み書きに必要なストレージ インターフェース実装を供給します。その IStorage、IStream、IEnumStatStg は明示的インターフェースの所有と、切り離されたネイティブ コンテナ状態を保持します
| ファクトリとヘルパー | 契約 |
|---|---|
XlsOpenCompoundStorage(Source, Storage) | ストリーム オフセット 0 から読み取り専用コンテナを読み込みます |
XlsOpenCompoundStorage(Source, Start, Storage) | 明示された負でないオフセットからコンテナを読み込みます |
XlsCreateCompoundStorage(Storage) | ネストしたスコープとストリームを持つ書き込み可能なネイティブ ストレージを作成します |
XlsWriteCompoundStorage(Storage, Destination) | ネイティブのルート ストレージを指定されたストリームへ直列化します。外部実装や非ルートのストレージは拒否されます |
XlsFreeCompoundStorageName(Name) | ストレージ統計や列挙が返したネイティブ名を解放します。nil も受け付けます |
ファクトリは HResult を返します。返されたインターフェースを使う前に Succeeded(Result) を確認し、使い終わったらインターフェース参照を解放してください
読み取り専用の変更は失敗し、複製されたストリーム カーソルは独立した位置を保ち、ネストしたコピーは親の識別子と対応メタデータを保持します。直接の直列化は、上位レベルのワークブック宛先トランザクション契約を提供しません
正規ワークブック識別子
lxStandard の XlsIdentifierKeyText(const A: WideString): WideString は、既存の固定 Unicode 識別子キーの UTF-16 テキスト表現を返します。これにより Classic の定義名ストレージが、他のワークブック エンジンと正規の同値性を共有できます
このキー表現は表示スペルではなく、同一性と検索のためのものです。作成された名前は変わらず、CFB ディレクトリの比較器はフォーマットが義務付ける別の順序を保ちます
ネイティブ ビルド要件と検証済み BIFF8 ワークブック契約については Free Pascal サポート を、対応する暗号化と平文プロパティ ストリームの動作については Classic の暗号化 を参照してください