复合文档学习(六) - 目录Directory
生活随笔
收集整理的這篇文章主要介紹了
复合文档学习(六) - 目录Directory
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.概述
二.Directory Structure?- 目錄結構
1.directory?是由一系列directory entries組成的一個內部控制流。
2.每一個directory entry?指向復合文檔文件中一個倉庫storage或一個流stream3.directory entry按照它們在流中出現的順序列舉 4.一個directory entry從0開始的索引叫做directory entry identifier(DirID)
2.1?directory entry??位置
- 只要復合文檔中存在倉庫storage或流stream的引用,directory entry的位置就不會改變。?這意味著storage存儲或流stream的DirID永遠不會改變,而不管其他對象被插入或從復合文檔中移除。
- ?如果一個倉庫storage或流stream被刪除,相應的directory entry被標記為空。
- ?directory的開頭有一個特殊的directory entry(DirID為0),它代表為?root storage ,稱其為根倉庫條目 -?root storage entry
2.2 倉庫storage的直接成員
directory將每個倉庫storage的直接成員(倉庫storage和流stream)組織在一個單獨的紅黑樹red-black tree 中。 紅黑樹中的節點必須滿足以下所有條件:- 根節點為黑色。
- 紅色節點的父節點為黑色。
- 從根節點到所有葉的路徑包含相同數量的黑色節點。
- 節點的左子節點小于節點,右子節點較大。
2.3 例子
- 根倉庫 root storage 由?root storage entry表示,它沒有parent directory entry,因此沒有其他可以組織在紅黑樹中的entry
- root storage的所有成員(“Storage1”,“Storage2”,“Stream1”,“Stream2”,“Stream3”和“Stream4”)都插入到紅黑樹中。 此樹的根節點?root node的DirID存儲在根倉庫條目?root storage entry中。
- 倉庫“Storage1”包含一個成員“Stream1”,插入到單獨的紅黑樹中,?“Storage1”的目錄條目directory entry包含“Stream1”的DirID。
- 倉庫“Storage2”包含三個成員“Stream21”,“Stream22”和“Stream23”。 這些目錄條目directory entries組織在一個單獨的紅黑樹中。 “Storage2”的目錄條目directory entry包含此樹的根節點的DirID。
2.4 總結
1.每個directory entry最多包含3個DirID:- 第一個DirID是包含此Entry的紅黑樹的左孩子的DirID
- 第二個DirID是包含此Entry的紅黑樹的右孩子的DirID
- 如果此Entry是一個倉庫storage,第三個DirID是包含所有子流和子倉庫sub storages的另一個紅黑樹的DirID
- 如果名稱較短,一個節點小于另一個節點; 如果名稱較長,則更大。
- 如果兩個名稱的長度相同,則逐個比較(不區分大小寫)
三.?Directory Entries?- 目錄條目
3.1?Directory Entry Structure?- 目錄條目結構
1.每個目錄條目directory entry 的大小恰好是128個字節 2.從一個DirID計算目錄流directory stream的偏移量的公式如下: dir_entry_pos(DirID) = DirID ? 1283.?目錄條目結構directory entry structure的內容: 3.2?Starting Position of a Stream? - 一個流的開始位置
1.一個directory entry記錄了一個流的入口,既一個流的目錄條目directory entry包含流數據第一個扇區sector或短扇區?short-sector的SecID 2.在復合文檔頭中定義了標準流的大小,所有小于標準流大小的流都以短流short-stream存儲,從而插入到短流容器流?short-stream container stream中,在這種情況下,?短流容器流short-stream container stream中第一個短扇區?short-sector的SecID和短扇區分配表short-sector allocation table用于構建流的SecID chain 四.Time Stamp?- 時間戳
1.時間戳字段是一個無符號的64位整數值,包含從1601年1月160日00:00:00(公歷)起經過的時間。 2.該值的一個單位等于100納秒(10-7秒)。 這意味著,每秒鐘的時間戳等于10百萬個單位 3.從時間戳計算日期時,必須尊重閏年處理的正確規則:- 能被4整除的year是閏年;
- 能被100整除的year也可能不是閏年(例如,1900年沒有閏年);
- 能被400年整除的year是閏年(例如2000年是閏年)。
總結
以上是生活随笔為你收集整理的复合文档学习(六) - 目录Directory的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux安装MySQL5.7.37
- 下一篇: textpad java sdk_如何防