Windows 版 (精华区)

发信人: jazz (原来的我), 信区: Windows
标  题: [转载] 谈谈Win95的长文件名  
发信站: 紫 丁 香 (Fri May  1 21:00:13 1998), 转信

【 以下文字转载自 Software 讨论区 】
【 原文由 checcy 所发表 】
一、长文件名简述
    ⒈Windows 95的VFAT文件系统和长文件名
    Windows
95中采用了层次文件系统体系结构,支持多文件系统。在Windows
95中
对于磁盘的管理默认采用VFAT(保护模式的FAT) 文件系统。Windows
95中的长文件名
即由VFAT提供支持和管理。
   
VFAT中允许文件名达到256个字符(包括终止的空字符),目录路径(包括驱动器号、
冒号和引导符,但不含文件名)达到246个字符,全路径允许260个字符(包括驱动器号、
冒号、引导符、文件名和终止字符)。长文件名中不可以包含以下字符:
    ?  \  *  "  <  >  |
    Windows
95将保存长文件名中字母的大小写信息,但VFAT在查找文件时,总是将
字母全部转换为大写。因此在同一目录下不允许有两个或两个以上的具有相同文件名、
仅仅是大小写不同的文件存在。在磁盘上长文件名采用Unicode字符集存储。在Windows
95的DOS Prompt中DOS程序可以调用INT
21H中的71xxH功能(这一组功能调用由VFAT支
持,因此不能在DOS 7中使用)访问长文件名。
    ⒉长文件名的别名
    应用程序创建一个有长文件名的文件或目录时,
系统将自动地生成一个符合8.3
格式的相应的短文件名(别名)。别名保证了那些不能处理长文件名的应用程序能够存
取文件或目录。在磁盘上别名采用当前代码页的OEM字符集存储。
    如果长文件名符合8.3格式,
那么别名将只把长文件名中的小写字母换成大写。
如果长文件名不符合8.3格式,
那么系统用下述办法自动生成一个别名,且别名是唯
一的。生成的别名格式为:
   
字母前缀+连接符号“ ̄”+数字域(序号)+符号“?”+后缀。
   
首先,系统取长文件名的前6位(去掉空格及其他8.3文件名中不合法的字符)作为
字母前缀;
然后取字母前缀相同的别名个数加1作为序号,如果序号大于9则字母前
缀取长文件名的前5位;
再取长文件名中最后一个‘?’后的三位合法字符作为后缀
(如果长文件名中只有一个‘?’
且是第一个字符或长文件名中没有‘?’,则别名
无后缀)。例如MyFile.731019.Document是一个合法的长文件名,它的别名即为MYFIL
E~1.DOC。

二、Windows 95中长文件名的存储
    ⒈长文件名及其别名的存储格式
   
VFAT中依然采用32字节的目录项对目录信息进行描述。只是对其含义进行了扩充。
原FAT文件系统中,目录项的格式与文件属性含义如下。
        位  置        含   义               位 7 6 5 4 3 2 1
0   含  义
      ------------------------------       
----------------------------
       00H - 0AH   8.3的文件名                 0 0 0 0 0 0 0
1   只  读
             0BH   文件属性                    0 0 0 0 0 0 1
0   隐  藏
       0CH - 15H   DOS保留                     0 0 0 0 0 1 0
0   系  统
       16H - 17H   文件最后修改时间            0 0 0 0 1 0 0
0   卷  标
       18H - 19H   文件最后修改日期            0 0 0 1 0 0 0
0   子目录
       1AH - 1BH   文件首簇号                  0 0 1 0 0 0 0
0   归  档
       1CH - 1FH   文件长度                
----------------------------
       (图 1. 原DOS中目录项的含义)          位7, 位6
未使用,总为0
                                              (图 2.
文件属性位的含义)
   
VFAT将目录项分为长文件名目录项和短文件名目录项两种。这两种目录项通过文
件属性进行区分。VFAT将长文件名的文件属性置为“卷标+系统+隐藏+只读”(0FH),
并按长文件名的目录项格式进行存储;否则以短文件名目录项格式存储。
    Windows
95为何选择这样的一个属性组合来区分长文件名和短文件名呢?在以前
版本的DOS中,
这是一个不可能出现的文件属性组合,并且在微软当时的测试中,这

个错误不能被当时的任何一种磁盘检查工具所查到和纠正。
    新的目录项格式均不同于已往DOS中目录项的格式。
短文件名目录项将原先保留
的字节用于存储文件创建日期、时间以及文件访问日期。长文件名目录项则由长文件
名目录链指针(存储序号)、文件名、文件属性、类型值、校验和以及首簇号六部分组
成。长文件名目录链指针下面将详细论述。VFAT对长文件名的存储分为三个部分,分
别占用了原8.3文件名区、
原保留区和日期时间区以及文件长度区。类型值域被保留
未使用。校验和根据短文件名得到,如果短文件名在Windows
95环境外被修改了,则
可以通过校验和察觉长文件名不再有效。
首簇号在长文件名中为了与原DOS兼容而不
使用,被始终置为00H,00H。
    00H - 0AH  8.3的文件名              00H 
长文件名目录链序号
          0BH  文件属性                                   
(Ordinal)
          0CH  保留               01H - 0AH 
文件名(第一部分,
               Windows NT使用               
共10个字节,存5位长文件名)
    0DH - 0FH  文件创建时间             0BH 
文件属性(0FH=08H+04H+02H+01H
    10H - 11H  文件创建日期                 
=卷标+系统+隐藏+只读)
    12H - 13H  文件访问日期             0CH 
类型(Type,保留,总为0)
    14H - 15H  扩展文件属性句柄         0DH 
校验和(CheckSum,算法未知)
               DOS,Windows总为0   0EH - 19H 
文件名(第二部分,共12个字节,
    16H - 17H  文件最后修改时间              存6位长文件名)
    18H - 19H  文件最后修改日期   1AH - 1BH 
文件首簇号(不使用,为00H,00H)
    1AH - 1BH  文件首簇号         1CH - 1FH 
文件名(第三部分,共四个字节,
    1CH - 1FH  文件长度                      存2位长文件名)
  (图 3. VFAT短文件名目录项含义)       (图 4.
VFAT长文件名目录项含义)
  ⒉长文件名与短文件名的链接关系
    Windows
95采用多个连续的长文件名目录项来存储长文件名,这就形成了一个目
录链,在这个目录链中,长文件名目录项按下图所示存储。且长文件名不能脱离短文
名目录项而单独存在,否则,长文件名无效。
                    ┏━━━━━━━━━━━━━━━┓
                    ┃       目录链的最后一项       ┃
                    ┠───────────────┨
                    ┃            …  …            ┃
                    ┃        目录链的其它项        ┃
                    ┃            …  …            ┃
                    ┠───────────────┨
                    ┃        目录链的第二项        ┃
                    ┠───────────────┨
                    ┃        目录链的第一项        ┃
                    ┠───────────────┨
                    ┃ 长文件名关联的短文件名目录项 ┃
                    ┗━━━━━━━━━━━━━━━┛
                         (图 5. 长文件名的目录链)
   
下面,我们详细地说明长文件名目录项与短文件名目录项是如何链接的。
   
⑴若长文件名长度小于13位,则长文件名仅占用一个长文件名目录项,并以00H,
00H表示结束。目录链序号为'A',表示该目录项既是第一个又是最后一个;
                       16进制信息                       
ASCII 信息
   
------------------------------------------------------------------
    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...

    FOREST   BMP        66,146  12-08-95   9:50      
Forest.bmp
               (图 6. 长文件名、短文件名目录项示意图一)

   
⑵若长文件名长度等于13位,则长文件名也仅占用一个长文件名目录项。目录链
序号为'A';
                       16进制信息                       
ASCII 信息
   
-------------------------------------------------------------------
    41 50 00 72 00 6F 00 67-00 72 00 0F 00 20 61 00  
AP.r.o.g.r... a.
    6D 00 20 00 46 00 69 00-6C 00 00 00 65 00 73 00   m.
.F.i.l...e.s.
    50 52 4F 47 52 41 7E 31-20 20 20 11 00 00 00 00  
PROGRA~1   .....
    00 00 2F 20 00 00 66 8F-2F 20 4E 23 00 00 00 00   ../
..f./ N#....

    PROGRA~1       <DIR>        01-15-96  17:59      
Program Files

               (图 7. 长文件名、短文件名目录项示意图二)

   
⑶若长文件名长度大于13位,则长文件名占用多个长文件名目录项。第一个目录
项的序号为ASCII码01,第二项的序号为ASCII码02,……,最后一项的序号采用公式
CHR(X - 1 + 字母'A'的ASCII码)确定(一定是个英文字母)。
    其中X表示长文件名占用的目录项数,其计算方法如下:
    ① L = 长文件名 / 13
    ② 若L是整数,则X = L;若L不是整数,则X=(取L的整数部分 +
1)

                       16进制信息                       
ASCII 信息
   
-------------------------------------------------------------------
    42 62 00 6D 00 70 00 00-00 FF FF 0F 00 FA FF FF  
Bb.m.p..........
    FF FF FF FF FF FF FF FF-FF FF 00 00 FF FF FF FF  
................
    01 43 00 61 00 72 00 76-00 65 00 0F 00 FA 64 00  
.C.a.r.v.e....d.
    20 00 53 00 74 00 6F 00-6E 00 00 00 65 00 2E 00   
.S.t.o.n...e...
    43 41 52 56 45 44 7E 31-42 4D 50 20 00 00 00 00  
CARVED~1BMP ....
    00 00 CA 20 00 00 40 4E-88 1F 6D 25 46 02 00 00   ...
..@N..m%F...

    CARVED~1 BMP           582  12-08-95   9:50       Carved
Stone.bmp

               (图 8. 长文件名、短文件名目录项示意图三)

三、Windows 95长文件名的使用技巧
    ⒈在Windows 95中只建立短文件名
    通过上面对VFAT存储长文件名和短文件名的分析,Windows
95每存储一长文件名,
则至少占用两个目录项。因此虽然Windows
95提供了长文件名功能,但应慎重使用。
否则将会带来严重的后果:没有足够的空间存储根目录下的文件名或者浪费了大量的
磁盘空间去存储长的子目录名和子目录下的文件名。最好只在必要的时候使用长文件
名, 那么如何让Windows
95只建立短文件名呢?只需键入符合8.3格式的文件名,并
全部采用大写形式即可。
    ⒉在Windows 95下使用原先的磁盘实用程序
    由于Windows 95之前发行的大部分磁盘实用程序与Windows
95的扩展文件系统不
兼容,因此需要对它们进行升级以适应新的文件系统。如果使用了这些未升级的程序
(如Norton 8.0及其以前版本、PC Tools、Defrag、Stacker 4.0等)
,则可能会造成
长文件名丢失,甚至丢失数据。
    在特殊情况下,
如果还需要运行为旧版本Windows或MS-DOS创建的 “备份” 或
“磁盘碎片整理” 等实用程序,则可以使用Windows
95光盘版中的LFNBK实用程序或
Stacker
4.1中提供的SAVELFN实用程序来删除磁盘上的长文件名,并在事后恢复原长
文件名信息。 需要注意的是LFNBK只能在Windows 95的DOS
Prompt下使用,并且不可
保证总能恢复原长文件名。相比之下,SAVELFN采用绝对磁盘读写可以在任何DOS版本
下使用,并且一般都能恢复原长文件名。
    ⒊如何排序目录
   
前几天,我从某个BBS上(忘记名字了)下载了一个老外写的LFN排序软件,结果很
悲惨,根目录变的一塌糊涂,修复了半天才好。我看还是过几天,我将我们写的LFN
排序程序上载到站上供大家使用(目前正在测试,因为关系目录信息不敢贸然上传)。
    ⒋长文件名的实现思路为我们提供的其他用途
   
长文件名的实现思路为我们提供了一些其他的用途。譬如:AV95的试用版就采用
了类似的方法来存储运行的次数,只是AV95试用版只建立了两个属性为0FH
的无效目
录项,一个名字是0xFF,一个是WIN95LOG.SYS。只要将这两个目录项置为被删除,即
可重新获得30次的运行次数。

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: checcy@public.hr.hl.]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: hitatc.hit.edu.c]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:204.639毫秒