Magazyn plików złożonych
lxCompoundFile czyta i zapisuje kontenery Compound File Binary przez strumienie Pascala, łącznie z zagnieżdżonymi zakresami magazynu, ładunkami MiniFAT i łańcuchowymi sektorami DIFAT; natywne API skoroszytu Classic BIFF8 korzystają z tego backendu na Linuksie i macOS
Do pracy z arkuszem używaj zwykłych wywołań Open i SaveAs skoroszytu; niższego poziomu API poniżej przydają się do inspekcji zagnieżdżonych strumieni, budowania kontenerów i zachowywania metadanych magazynu
Odczyt lub budowa kontenera
TlxCompoundFile.LoadFromStream(AStream, AOwnsStream) wczytuje metadane katalogu i alokacji; AOwnsStream domyślnie ma wartość False, a strumień podkładowy musi pozostać dostępny podczas wyciągania swojej zawartości
CreateNew(AStream, AOwnsStream) przygotowuje nowy kontener, AddStorage i AddStream kolejkują jego zawartość, a Save zapisuje kontener w wersji 3 z wymaganymi sektorami rozszerzenia DIFAT
| Składnik | Zachowanie |
|---|---|
RootIndex | Tożsamość wpisu katalogu głównego, używana jako rodzic dla magazynów i strumieni najwyższego poziomu |
AddStorage(Name, ParentIndex) | Kolejkuje zagnieżdżony magazyn i zwraca jego tożsamość katalogową do dodawania potomków |
AddStream(Name, Data) | Kolejkuje strumień bajtów na poziomie korzenia |
AddStream(Name, Data, ParentIndex) | Kolejkuje strumień bajtów w wybranym zakresie rodzica i zwraca jego tożsamość |
OpenStream(Name), OpenStream(Name, ParentIndex) | Wyciągają strumień korzeniowy lub o określonym zakresie do posiadanego TlxCfbStream; brakujący strumień zwraca nil |
OpenEntryStream(Index) | Wyciąga strumień katalogowy po tożsamości; nieprawidłowy wpis albo wpis inny niż strumień zwraca nil |
HasStream(Name), HasStream(Name, ParentIndex) | Sprawdzają obecność strumienia w korzeniu albo w wybranym zakresie rodzica |
FindStorage(Name, ParentIndex) | Zwraca tożsamość magazynu u wybranego rodzica albo -1, gdy brak pasującego magazynu |
EntryCount, Entries(Index) | Podglądają wczytane wpisy katalogu; indeksy są numerowane od zera i muszą być poprawne |
SetEntryMetadata(Index, Entry) | Kopiuje wyłącznie identyfikator klasy, bity stanu i znaczniki czasu do poprawnego skolejkowanego wpisu albo korzenia; tożsamości strukturalne i ładunki pozostają bez zmian |
Rekord TlxCfbEntry udostępnia Name, EntryType, StartSector, Size, LeftSibling, RightSibling, Child i wyliczone ParentIndex; łącza katalogowe to indeksy, a -1 oznacza brakującą tożsamość
Jego pola metadanych to ClassID, StateBits, CreationTime i ModificationTime; znaczniki czasu zachowują surowe tyknięcia FILETIME od epoki 1601 UTC zamiast daty formatowanej wg ustawień regionalnych
TlxCfbEntryType zawiera cfbEmpty, cfbStorage, cfbStream i cfbRoot; TlxCfbStream udostępnia Name, Size, Data, Read, Seek i CopyTo
Wyciągnięte strumienie posiadają odłączone bajty i muszą być zwalniane przez wywołującego; uszkodzenia, niekompletne łańcuchy, nieprawidłowa własność i cykliczne grafy katalogowe albo alokacyjne są odrzucane zamiast zwracać obcięte ładunki
lxCfbCompareNames(A, B) stosuje porządek Compound File Binary „najpierw długość” z przypiętym prostym mapowaniem na wielkie litery BMP; zduplikowane nazwy są ograniczone do rodzica, a identyczne nazwy w osobnych zagnieżdżonych magazynach pozostają odrębne
Natywne interfejsy magazynu
Na celach poza Windows lxOLE dostarcza implementację interfejsu magazynu wymaganą przez wczytywanie i zapis skoroszytów Classic; jej IStorage, IStream i IEnumStatStg zachowują jawną własność interfejsów i odłączony stan natywnego kontenera
| Fabryka lub pomocnik | Kontrakt |
|---|---|
XlsOpenCompoundStorage(Source, Storage) | Wczytuje kontener tylko do odczytu od offsetu zerowego strumienia |
XlsOpenCompoundStorage(Source, Start, Storage) | Wczytuje kontener od jawnego nieujemnego offsetu |
XlsCreateCompoundStorage(Storage) | Tworzy zapisywalny natywny magazyn z zagnieżdżonymi zakresami i strumieniami |
XlsWriteCompoundStorage(Storage, Destination) | Serializuje natywny magazyn korzeniowy do podanego strumienia; obce implementacje i magazyny inne niż korzeń są odrzucane |
XlsFreeCompoundStorageName(Name) | Zwalnia natywne nazwy zwrócone przez statystyki lub enumerację magazynu; nil jest akceptowane |
Fabryki zwracają HResult; przetestuj Succeeded(Result) przed użyciem zwróconego interfejsu i zwalniaj odwołania interfejsów po skończeniu
Mutacja w trybie tylko do odczytu kończy się błędem, sklonowane kursory strumieni zachowują niezależne pozycje, a zagnieżdżone kopie zachowują tożsamość rodzica i obsługiwane metadane; bezpośrednia serializacja nie zapewnia kontraktu transakcji celu wyższego poziomu skoroszytu
Kanoniczne identyfikatory skoroszytu
XlsIdentifierKeyText(const A: WideString): WideString w lxStandard zwraca reprezentację tekstową UTF-16 istniejącego przypiętego klucza identyfikatora Unicode, pozwalając zapisowi nazw zdefiniowanych Classic dzielić kanoniczną równość z innymi silnikami skoroszytu
Ta reprezentacja klucza służy tożsamości i wyszukiwaniu, a nie wyświetlanej pisowni; napisane nazwy pozostają bez zmian, a komparator katalogu CFB zachowuje swoje odrębne, narzucone przez format porządkowanie
Zobacz wsparcie Free Pascal dla wymagań budowania natywnego i zweryfikowanego kontraktu skoroszytu BIFF8 oraz szyfrowanie Classic dla obsługiwanego szyfrowania i zachowania strumienia właściwości w postaci jawnego tekstu