FAT文件系统对长文件名的支持

根据前面的叙述我们知道,在FAT16文件系统中,由于FDT中的文件目录登记项只为文件名保留了8个字节,为扩展名保留了3个字节,所以DOS和Windows的用户为文件起名字时要受到8.3格式的限制。但是,从Windows95开始,这种限制被打破了。
在Windows9x中是如何实现长文件名的?它是怎样解决与DOS的兼容性?该方案存在什么问题?在使用中应该注意的事项有哪些?了解这些问题将会对用户在Windows9x中使用长文件名非常有益。
1.8.3文件名格式
FDT中文件目录登记项的内容及意义在前已经有了详细的说明,图6-10是一个具有32个字节的8.3格式的文件目录登记项的示意图。
因为长文件名需要考虑Windows9x与DOS6.x和Windows3.x的兼容问题,所以在Windows9x中实现的长文件名并不是对8.3格式的简单扩展,否则Windows9x中的长文件名就会在DOS6.x和Windows3.x系统中无法读取。
2.长文件名兼容的处理办法
我们知道,除一些磁盘工具软件之外,大多数应用程序都不是直接访问磁盘而是通过操作系统获得文件或目录名。此外,如果设置文件属性为OFH、DOS和Windows3.x就会忽略该目录的登记项。Windows9x正是基于这两点来解决长文件名与DOS和Windows3.x的兼容问题的。
         
                     图6-10 32字节的8.3文件名格式目录登记项示意图
在Windows9x中,文件或目录实际存储着两个名字,一个长文件名和一个长文件名的别名(短文件名)。其中,作为别名的短文件名储存在8.3格式的32字节的目录登记项中,长文件名则存储在属性标志为OFH的32字节目录登记项中,每个这样的目录登记项存储13个字符,每个文件名需要若干个这样的目录登记项,当需要的时候Windows9x会把它们重新组成长文件名。
当创建一个长文件名时,长名目录项和对应的别名(短名)目录项的存储有以下6个处理原则:
·取长文件名的前6个字符加上“~1”形成长文件名的别名(即短文件名),并将长文件名中最后一部分(最后一个间隔符“.”后面字符)的前3个字符作为其扩展名。
·如果已存在这个名字的文件,则符号“~”后的数字会自动增加。
·任何包括小写字母的文件名都被看作是长文件名,而不管其长度是多少。如果有对于DOS和Windows3.x非法的字符,则用下划线替代。
·长文件名存储在属性标志为OFH的32字节目录登记项中(这是与短文件名目录项的区别)。用Unicode格式编码,每个字符(无论是英文或是汉字)均占2字节。
·每个目录登记项用26个字节存储13个字符(序号由第1字节指定)。位置多余时,先用00表示结束,再用FFH填充。
·长文件名用若干个长名目录项保存,长文件名目录项倒序排在文件短目录项前面。
采用以上的存储办法后,在Windows9x下创建的长文件名在DOS或Windows3.x下就只能看见其对应的短文件名,完全忽略了长文件名。在Windows9x下运行的应用程序通过操作系统请求文件名时,Windows9x会根据应用程序的性质分别给予不同的文件名,16位应用程序得到8.3格式的文件名,而32位应用程序得到长文件名。
表6-14是一些长文件名和对应的8.3格式短文件名的实例。
表6-14 长文件名及所对应的8.3格式短文件名实例

长 文 件 名 对应的8.3格式别名
Report.jsjx.sec.Sep2001 REPORT~1.SEP
REPORT.ZHANG.SEP99 REPORT~2.SEP
This is Zhang Ming Report THISIS~1
File.txt FILE.TXT


图6-11所示就是长文件名使用的目录登记项的格式。其中长文件名使用Unicode格式,每个字符需要2个字节的空间,一个长文件名需要若干个这样的目录登记项。

             

                      图6-11 32字节的长文件名格式目录登记项示意图
目录登记项第一个字节的低5位指明它在文件名中的顺序号。例如第一个为1,第二个位,依次类推。第一个字节的第六位是“1”就表明它是最后一个。
在Windows9x下即使创建一个少于8个字符的文件名,仍然会使用长文件名格式的目录登记项,因为长文件名是要区分大小写的。
3.短文件名与长文件名目录项的链接关系
Windows9x采用多个连续的长文件名目录项来存储长文件名,这就形成了一个目录链,在这个目录链中,长文件名目录按照图6-12所示的方式存储。并且长文件名不能脱离短文件名目录项而单独存在,否则,长文件名无效。
下面,我们详细地说明长文件名目录项与短文件名目录项是如何链接的。
若长文件名长度小于13个字符,则长文件名仅占用一个长文件名目录项,并且第一个字节为“A”(第6位是“1”),表明该目录项既是第一个又是最后一个。
例如,文件名为“Forest.bmp”的长文件名目录项和对应的短文件名目录项为:
(长文件名目录项):
41 46 00 6F 00 72 00 65-00 73 00 0F 00 91 74 00 AF.o.r.e.s....t.
2E 00 62 00 6D 00 70 00-00 00 00 00 FF FF FF FF ..b.m.p........
(短文件名目录项):
46 4F 52 45 53 54 20 20-42 4D 50 20 00 00 00 00 FOREST BMP...
00 00 CA 20 00 00 40 4E-88 1F 10 24 62 02 01 00 ... ..@N...$b...
用DIR命令列表显示为:
FOREST BMP 66,146 12-08-95 9:50 Forest.bmp
若长文件名长度等于13个字符,则长文件名也仅占用一个长文件名目录项。并且第一个字节为“A”(第6位仍然是“1”),表明该目录项既是第一个又是最后一个。
若长文件名长度大于13个字符,则长文件名占用多个长文件名目录项。第一个目录项的序号为ASCII码01,第二项的序号为ASCII码02,......,最后一项的序号采用公式CHR(X-1+字母“A”的ASCII码)确定(一定是个英文字母)。
其中X表示长文件名占用的目录项数,其计算方法如下:
L=长文件名/13
若L是整数,则X=L;若L不是整数,则X=(取L的整数部分+1)
例如,文件名为“123456789abcdefghijk.txt”的长文件名目录项和对应的短文件名目录项为:
(长文件名目录项2):
42 65 00 66 00 67 00 68-00 69 00 0F 00 2A 6A 00 Be.f.g.h.i...*j.
6B 00 2E 00 74 00 78 00-74 00 00 00 00 00 FF FF k...t.x.t.....
(长文件名目录项1):
01 31 00 32 00 33 00 34-00 35 00 0F 00 2A 36 00 .1.2.3.4.5...*6.
37 00 38 00 39 00 61 00-62 00 00 00 63 00 64 00 7.8.9.a.b...c.d.
(短文件名目录项):
31 32 33 34 35 36 7E 31-54 58 54 20 00 6C 69 60 123456~1TXT.li`
A6 2A A6 2A 00 00 50 60-A6 2A 02 00 9C 00 00 00 .*.*..P`.*....
用DIR命令列表显示为:
123456~1 TXT 156 05-06-01 12:02 123456789abcdefghijk.txt
在查看长文件名的目录项的时候,应按照图6-11所示的说明,注意观察长文件名每个目录项中的第一个字节。例如,上述“(长文件名目录项2)”中的“42”,表示该项为第2项,且为最后一个目录项。
4.在DOS方式下怎样使用长文件名
DOS界面实际上也是支持长文件名的,只需在长文件名外加上双引号即可。例如,
C>REN "123456789ABCDEF.TXT" "12345678912345.TXT"
C>REN "1996 repo rts*.doc" "1997 reports*.doc"
以上的DOS命令是合法的。如果文件名的前3个字符是月份的缩写(如"Jan reportdraft.doc"),还可以使用以下命令重命名它。
C>REN "???R*.doc" "???reports completed.*"
DOS对长文件名与短文件名的处理是一样的,但替换字符串的长度不能超过被替换的字符串的长度,否则可能覆盖文件名的其余字符。重命名后,使用dir命令并添加双引号括起来的长文件名(其中可包含通配符),在屏幕上的目录列表的右侧一栏会显示完整的文件名。
5.使用长文件名存在的问题
Windows9x通过以上办法虽然实现了长文件名与DOS和Windows3.x的兼容,但也存在着一些问题:
(1)长文件名要占用较多的目录登记项,而FAT文件系统根目录下的目录登记项的数目又是固定的,一般为512个。一个128字符的长文件名就需要11个文件目录登记项(其中1个用于存储短文件名,其余10个用于存储长文件名)。
(2)Windows9x中创建的长文件名在DOS或Windows3.x下更名或删除时,其长文件名将会丢失,用于长文件名的目录登记项空间自然也无法收回。
(3)在Windows9x中运行16位的应用程序时,当该程序要改一文件名时,长文件名将会丢失。
(4)由于长文件名使用的目录登记项必须是连续的,频繁的创建和删除长文件名,将会造成大量的磁盘碎片。
正因为Windows9x长文件名存在以上的问题,所以,如果用户主要使用16位的应用程序或者需要与DOS和Windows3.x交换文件时,最好禁止使用长文件名。如果主要使用32位的应用程序,就可以使用长文件名,但使用时注意:
·尽量不要在根目录下创建长文件名。
·经常运行Windows9x中的磁盘碎片规整程序,回收丢失的目录登记项。

没有更多推荐了,返回首页