复合二进制文档(CFBF),也称**复合文档,**是微软开发的一种实现COM结构化存储的文件格式,用于把多个对象内容存放在一个硬盘文件里。
Microsoft已经开放了这个文件格式。广泛用于Microsoft Word与Microsoft Access。也是Advanced Authoring Format的基础。
文件结构CFBF文件头部是512字节,随后跟着是保存数据的扇区。扇区的长度在文件头部指定,通常是512字节或4096字节。
CFBF的扇区类型:
FAT扇区
MiniFAT扇区:用于Mini-Stream
Double-Indirect FAT (DIFAT)扇区 - 包含FAT扇区索引的链表数据
Directory扇区
Stream扇区 - 包含数据内容
Range Lock扇区 - 包含大文件的上锁的字节范围1
CFBF文件头CFBF头是该文件的最前的512字节。对应于C语言数据结构为:
typedef unsigned long ULONG; // 4 Bytes typedef unsigned short USHORT; // 2 Bytes typedef short OFFSET; // 2 Bytes typedef ULONG SECT; // 4 Bytes typedef ULONG FSINDEX; // 4 Bytes typedef USHORT FSOFFSET; // 2 Bytes typedef USHORT WCHAR; // 2 Bytes typedef ULONG DFSIGNATURE; // 4 Bytes typedef unsigned char BYTE; // 1 Byte typedef unsigned short WORD; // 2 Bytes typedef unsigned long DWORD; // 4 Bytes typedef ULONG SID; // 4 Bytes typedef GUID CLSID; // 16 Bytes struct StructuredStorageHeader { // [offset from start (bytes), length (bytes)] BYTE _abSig[8]; // [00H,08] {0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, // 0x1a, 0xe1} for current version CLSID _clsid; // [08H,16] reserved must be zero (WriteClassStg/ // GetClassFile uses root directory class id) USHORT _uMinorVersion; // [18H,02] minor version of the format: 33 is // written by reference implementation USHORT _uDllVersion; // [1AH,02] major version of the dll/format: 3 for // 512-byte sectors, 4 for 4 KB sectors USHORT _uByteOrder; // [1CH,02] 0xFFFE: indicates Intel byte-ordering USHORT _uSectorShift; // [1EH,02] size of sectors in power-of-two; // typically 9 indicating 512-byte sectors USHORT _uMiniSectorShift; // [20H,02] size of mini-sectors in power-of-two; // typically 6 indicating 64-byte mini-sectors USHORT _usReserved; // [22H,02] reserved, must be zero ULONG _ulReserved1; // [24H,04] reserved, must be zero FSINDEX _csectDir; // [28H,04] must be zero for 512-byte sectors, // number of SECTs in directory chain for 4 KB // sectors FSINDEX _csectFat; // [2CH,04] number of SECTs in the FAT chain SECT _sectDirStart; // [30H,04] first SECT in the directory chain DFSIGNATURE _signature; // [34H,04] signature used for transactions; must // be zero. The reference implementation // does not support transactions ULONG _ulMiniSectorCutoff; // [38H,04] maximum size for a mini stream; // typically 4096 bytes SECT _sectMiniFatStart; // [3CH,04] first SECT in the MiniFAT chain FSINDEX _csectMiniFat; // [40H,04] number of SECTs in the MiniFAT chain SECT _sectDifStart; // [44H,04] first SECT in the DIFAT chain FSINDEX _csectDif; // [48H,04] number of SECTs in the DIFAT chain SECT _sectFat[109]; // [4CH,436] the SECTs of first 109 FAT sectors };FAT扇区每个FAT条目长度4字节,包含下个FAT链表条目的扇区号,或下述特定值:
FREESECT (0xFFFFFFFF) - 未用扇区
ENDOFCHAIN (0xFFFFFFFE) - FAT链表最后一个扇区
FATSECT (0xFFFFFFFD) - 用于FAT数据存储
DIFSECT (0xFFFFFFFC) - 用于DIFAT数据存储1
词汇表FAT- 文件分配表,也称SAT- 扇区分配表
DIFAT- Double-Indirect File Allocation Table
FAT Chain- 一群FAT条目指出分配给一个流的那些扇区
Stream- 一个数据对象的内容
Sector- 扇区,占据512或4096个字节2
COM结构化存储COM结构化存储(也称“OLE结构化存储”)是微软在Windows操作系统上开发的一种技术,以在一个文件内存储层次化的数据。严格讲,术语“structured storage”是指COM的一套接口。并提供了有限形式的原子事务数据访问。
结构化存储广泛用于Microsoft Office应用程序。但从Office 2007开始默认使用基于XML的Office Open XML。SQLServer也使用结构化存储。
结构化存储是为了解决在一个文件中存放多个数据对象的本质性困难。当修改一个对象从而改变其尺寸时,如果这些对象在文件内是顺序存放的,则被修改对象的尺寸扩大时所有在其后的对象都需要向后移动以腾出空间,被修改对象缩小尺寸时所有在其后的对象都需要向前移动。这样的困难有很多种办法应对,但应用程序开发者并不希望处理这样低层次的二进制文件格式问题。
结构化存储把文件系统的概念引入到文件内部。在文件内部构造一个树状层次结构。由存储对象和流对象构成。根节点为根存储,根存储下面可以有子存储或流对象。子存储下面可以再有子存储或流对象。存储对象本身不包含信息,它是子存储和流对象的容器。流对象是叶子节点,是数据的载体。2
本词条内容贡献者为:
李嘉骞 - 博士 - 同济大学