Opslag in compound files
lxCompoundFile leest en schrijft Compound File Binary-containers via Pascal-streams, inclusief geneste opslagscopes, MiniFAT-payloads en gekoppelde DIFAT-sectoren; native Classic BIFF8-werkmap-API's gebruiken deze backend op Linux en macOS
Gebruik gewone werkmap-Open- en SaveAs-aanroepen voor spreadsheetwerk; de onderstaande API's op lager niveau zijn handig voor het inspecteren van geneste streams, het bouwen van containers en het behouden van opslagmetadata
Een container lezen of bouwen
TlxCompoundFile.LoadFromStream(AStream, AOwnsStream) laadt map- en allocatiemetadata; AOwnsStream staat standaard op False, en de onderliggende stream moet beschikbaar blijven zolang je de inhoud extraheert
CreateNew(AStream, AOwnsStream) bereidt een nieuwe container voor, AddStorage en AddStream zetten de inhoud in de wachtrij, en Save schrijft een versie-3-container met eventuele benodigde DIFAT-extensiesectoren
| Lid | Gedrag |
|---|---|
RootIndex | De identiteit van het hoofdmapitem, gebruikt als ouder voor opslag en streams op het hoogste niveau |
AddStorage(Name, ParentIndex) | Zet een geneste opslag in de wachtrij en geeft zijn map-identiteit terug voor het toevoegen van kinderen |
AddStream(Name, Data) | Zet een bytestream op hoofdniveau in de wachtrij |
AddStream(Name, Data, ParentIndex) | Zet een bytestream in de gekozen ouder-scope in de wachtrij en geeft zijn identiteit terug |
OpenStream(Name), OpenStream(Name, ParentIndex) | Extraheert een stream op hoofdniveau of binnen een scope naar een beheerde TlxCfbStream; een ontbrekende stream geeft nil terug |
OpenEntryStream(Index) | Extraheert een mapstream op identiteit; een ongeldig item of een item dat geen stream is geeft nil terug |
HasStream(Name), HasStream(Name, ParentIndex) | Test of een stream bestaat in de hoofdmap of in de gekozen ouder-scope |
FindStorage(Name, ParentIndex) | Geeft een opslagidentiteit in de gekozen ouder terug, of -1 wanneer er geen matchende opslag bestaat |
EntryCount, Entries(Index) | Inspecteert geladen mapitems; indexen zijn zero-based en moeten geldig zijn |
SetEntryMetadata(Index, Entry) | Kopieert uitsluitend class ID, statusbits en tijdstempels naar een geldig item in de wachtrij of naar de hoofdmap; structurele identiteiten en payloads blijven onveranderd |
Het TlxCfbEntry-record stelt Name, EntryType, StartSector, Size, LeftSibling, RightSibling, Child en de afgeleide ParentIndex beschikbaar; mapkoppelingen zijn indexen, en -1 betekent een afwezige identiteit
De metadata-velden zijn ClassID, StateBits, CreationTime en ModificationTime; tijdstempels behouden rauwe FILETIME-ticks vanaf het 1601 UTC-tijdperk in plaats van een op landinstelling gebaseerde datum
TlxCfbEntryType omvat cfbEmpty, cfbStorage, cfbStream en cfbRoot; TlxCfbStream stelt Name, Size, Data, Read, Seek en CopyTo beschikbaar
Geëxtraheerde streams zijn eigenaar van losgemaakte bytes en moeten door de aanroeper worden vrijgegeven; corruptie, onvolledige ketens, ongeldig eigendom en cyclische map- of allocatiegrafieken worden geweigerd in plaats van afgekapte payloads terug te geven
lxCfbCompareNames(A, B) past de Compound File Binary-volgorde met lengte eerst toe met een vastgepinde eenvoudige BMP-hoofdlettertoewijzing; duplicaatnamen worden binnen hun ouder geplaatst, en identieke namen in aparte geneste opslagruimten blijven onderscheiden
Native opslaginterfaces
Op niet-Windows-doelen levert lxOLE de opslaginterface-implementatie die Classic-werkmap laden en opslaan nodig heeft; zijn IStorage, IStream en IEnumStatStg behouden expliciete interface-eigendom en losgemaakte native containerstatus
| Factory of helper | Contract |
|---|---|
XlsOpenCompoundStorage(Source, Storage) | Laadt een alleen-lezen container vanaf streamoffset nul |
XlsOpenCompoundStorage(Source, Start, Storage) | Laadt de container vanaf de expliciete niet-negatieve offset |
XlsCreateCompoundStorage(Storage) | Maakt beschrijfbare native opslag met geneste scopes en streams |
XlsWriteCompoundStorage(Storage, Destination) | Serialiseert de native hoofdopslag naar de meegegeven stream; implementaties van derden en niet-hoofdopslag worden geweigerd |
XlsFreeCompoundStorageName(Name) | Geeft native namen vrij die door opslagstatistieken of enumeratie zijn teruggegeven; nil wordt geaccepteerd |
De factories geven HResult terug; test Succeeded(Result) voordat je de teruggegeven interface gebruikt, en geef interfacereferenties vrij wanneer je klaar bent
Muteren in alleen-lezen modus mislukt, gekloonde streamcursors behouden onafhankelijke posities, en geneste kopieën behouden ouderidentiteit en ondersteunde metadata; directe serialisatie biedt niet het contract op hoger niveau voor de transacties van werkmappendoelen
Canonieke werkmap-identificaties
XlsIdentifierKeyText(const A: WideString): WideString in lxStandard geeft de UTF-16-tekstrepresentatie van de bestaande vastgepinde Unicode-identificatiesleutel terug, zodat Classic-opslag van gedefinieerde namen canonieke gelijkheid kan delen met andere werkmapengines
Deze sleutelrepresentatie is bedoeld voor identiteit en opzoeken, niet voor de weergegeven schrijfwijze; geschreven namen blijven onveranderd, en de CFB-mapvergelijker houdt zijn eigen door het formaat voorgeschreven volgorde aan
Zie Free Pascal-ondersteuning voor de native buildvereisten en het geverifieerde BIFF8-werkmapcontract, en Classic-versleuteling voor ondersteunde versleuteling en gedrag van property-streams in leesbare tekst