FAT32 目录项分析 (转载)
2012-12-09 16:04阅读:
http://blog.csdn.net/yangsongqbs/article/details/7796921
FAT32目录项分析
在FAT32文件系统中,文件名分为两种——长文件名、短文件名。这两种文件名都是存储在目录入口中的(DIR_ENTRY简写DE)中的,不过具体的DE组织结构和数据结构有所不同。
1、 短文件名
短文件名存储在短文件名入口(SHORT_DIR_ENTRY简写SDE)中,而且一个短文件名只需要一个SDE即可。
一个SDE大小为32字节,他的具体定义如下表:
描述
|
mName
|
0
|
11
|
短文件名(文件名和扩展名)
|
mAttr
|
11
|
1
|
文件属性:
ATTR_READ_ONLY
0x01
ATTR_HIDDEN
0x02
ATTR_SYSTEM
0x04
ATTR_VOLUME_ID
0x08
ATTR_DIRECTORY
0x10
ATTR_ARCHIVE
0x20
ATTR_LONG_NAME
ATTR_READ_ONLY| ATTR_HIDDEN |
ATTR_SYSTEM | ATTR_VOLUME_ID
高两位属性保留,且应该设置为0,文件创建后不应该修改这两个位
|
mNameCase
|
12
|
1
|
这个是段文件名的大小标志:
FNAME_LOWER_CASE
0x08——01000
FEXT_NAME_LOWER_CASE
0x10——10000
也就是说如果文件名是小写的话01000,而如果扩展名是小写的话则设置10000,而如果文件名和扩展名都是小写的则11000(0x18)。(这个字节的含义只是我不完全统计的结果)
|
mCrtTimeTenth
|
13
|
1
|
{文件创建时间的毫秒部分,这是一个十分之一秒的数量,其有效值是0-199,我基本没有使用}
|
mCrtTime
|
14
|
2
|
文件创建的时间
|
mCrtDate
|
16
|
2
|
文件创建的日期
|
mLstAccDate
|
18
|
2
|
文件最后的访问日期
|
mFstClusHI
|
20
|
2
|
这个文件起始簇号的高两个字节
|
mWrtTime
|
22
|
2
|
文件最后写的时间,创建也可以说成是写
|
mWrtDate
|
24
|
2
|
文件最后写的日期,创建也可以说成是写
|
mFstClusLO
|
26
|
2
|
这个文件的起始簇号的低两个字节
|
mFileSize
|
28
|
4
|
文件大小(字节数)
|
在SDE的前11个字节包含了8个字节的文件名和3个字节扩展名(在磁盘上不显式在文件名和扩展名中间保存一个分割符”.”),也就是说短文件需要符合8.3规则。8.3规则具体如下
a、 文件名不得长于8个字节
b、 扩展名不得长于3个字节
c、
文件名、扩展名必须是ASCLL中0x80前的字符(也就是说不得有中文等)
d、 文件名中的字符必须同时大写或者小写
e、 扩展名中的字符必须同时大小或者小写
f、
可以没有扩展名但是必须有文件名(这一点仿佛有问题,在如果系统盘是FAT32,则会看到一个名为“.rnd”)。
g、 文件名前、扩展名后不得有空格。
h、
除了在第一个字符可以为0x05以外,其他字符不可以是小于0x20的字符
i、 文件名扩展中不得包含如下字符0x22(”),
0x2A(*), 0x2B(+), 0x2C(,), 0x2E(.), 0x2F(/), 0x3A(:), 0x3B(;),
0x3C(<), 0x3D(=), 0x3E,(>) 0x3F(?), 0x5B([), 0x5C(/),
0x5D(]), and 0x7C(}).
mName还有如下情况
A、如果
mName [0] ==
0xE5,表示当前入口是已经删除了的。
B、 如果mName [0] ==
0x00,表示当前入口没有使用过,在这以后也没有分配目录入口了,如果是遍历的话,到这里就可以结束了。
C、 如果mName [0] ==
0x05,则实际文件名在这里的字符应该是0xE5。0xE5是
KANJI 引导字符。
D、前面说了mName实际分为两各部分
8-字节文件名,和
3-字节扩展名。如果文件名或扩展名字符数不够的话则以空格
(0x20)填充。
E、
在mName中的英文字符都是以大写的形式存储。
以下是一个例子
“foo.bar”
-> “FOO
BAR”
“FOO.BAR”
-> “FOO
BAR”
“Foo.Bar”
-> “FOO
BAR”
“foo”
-> “FOO
“
“foo.”
-> “FOO
“
“PICKLE.A”
-> “PICKLE A
“
“prettybg.big”
-> “PRETTYBGBIG”
“.big”
-> illegal, DIR_Name[0] cannot be 0x20(其实应该是可以的)
在这里好有一个需要注意的就是时间和日期格式。
时间(mCrtTime、mWrtTime)具体由两个字节(16位)表示,其精度为2秒(0是最低有效位,15是最高有效位)
0-4位:其有效值是
0-29,表示两秒数量,表示实际的秒为
0-58
5-10位:有效值是
0-59,表示分钟
11-15位:有效值是
0-23,表示小时
日期(mCrtDate、mLstAccDate、mWrtDate)具体由两个字节表示(16位),这是一个相对于
01/01/1980的一个日期(0是最低有效位,15是最高有效位)
0-4位:有效值是
1-31,表示日
5-8位:有效值是
1-12,表示月
9-15位:有效值
0-127,相对于
1980的年号(也就是说最大的年号是
2107年)
2、 长文件名
长文件名存储在长文件名入口(LONG_DIR_ENTRY简写LDE)中,通常一个长文件名的完整数据需要一个SDE和一系列的LDE组成,LDE逆序存放。
一个LDE大小为32字节,他的具体定义如下表: