经常会出现 DBLK 已写但是由于硬盘损坏,网络失败等原因导致不是所有关联的数据都成功读取的情况。 当出现这种情况时,不能正确读的流需要填充到正确的流大小。
一个 损坏对象描述块(MTF_CFIL)随后会写入来指明上一个 DBLK 关联的数据损坏了。 MTF_CFIL DBLK 包含了指示损坏的位置和长度。 它不用于任何类型的媒介错误恢复。
如果需要的话,对于一个特定对象只需一个 MTF_CFIL DBLK 写到媒介。 任何因为损坏而无法读取的部分被替换为 0。
注意:在流的头中指定的字节必须写到媒介中。
对象数据必须被填充的原因是大多数设备不允许回退到流的头来重写长度值。 如果流是变长的,如果没有合法的数据需要写,那么没必要完成超过本段的流。
偏移 | 字段名 | 类型 | 大小 |
---|---|---|---|
0 0h | 公共的块头 | MTF_DB_HDR | 52 字节 |
52 34h | 损坏对象属性 | UINT32 | 4 字节 |
56 3Ch | 预留 | - - - | 8 字节 |
64 40h | 流偏移 | UINT64 | 8 字节 |
72 48h | 损坏的流号 | UINT16 | 2 字节 |
公共的块头 字段是一个在每个 DBLK 开头的 52 字节的 MTF_DB_HDR 结构。 MTF_DB_HDR 的 DBLK 类型字段将被设置为 'CFIL'。 MTF_DB_HDR 包含了对所有的 DBLKs 来说都相同的字段以及一个 指向操作系特定数据区域的偏移。 这个区域包含了一个特定操作系的目录相关信息。
损坏对象属性 是一个 4 个字节组成的 32 比特的字段。 这个字段指定了这个 MTF_CFIL DBLK 的损坏数据的属性。 目前只有比特 16 - 18 有定义。 下表描述了比特的含义。
名称 | 说明 | 值 |
---|---|---|
CFIL_LENGTH_CHANGE_BIT | 本比特表示只从因为写操作打开文件以来文件的大小被修改了。 | BIT16 |
CFIL_UNREADABLE_BLK_BIT | 本比特表读取源媒介发生硬错误(硬盘)。这通常表示媒介已经损坏(比如,坏扇区)。 | BIT17 |
CFIL_DEADLOCK_BIT | 本比特表示文件被死锁。(比如:在支持文件锁的系统中,在一段时间内无法解锁文件区域)。 | BIT18 |
预留(设为 0) | BIT0 - BIT15 BIT19 - BIT23 | |
销售商特定 | BIT24 - BIT31 |
流偏移字段使用 UINT64 结构来指定数据流中损坏填充开始的偏移。 如果数据流是压缩的,偏移是当数据解压时损坏数据的偏移。
损坏的流数量是一个用于指示上一个 MTF_FILE DBLK 的数据流中哪个流包含损坏数据填充的两个字节的字。 需要记住跟在 MTF_FILE DBLK 后面的数据流部分可以包含若干个数据流每个都有一个流的头。 第一个数据流中的流为 1,第二个为 2,依次类。