1. 长文件名与短文件名

1.1. 何为短文件名

短文件名是DOS+FAT12/FAT16时代的产物,命名规则为8.3 
8是指文件名,3是指扩展名(完整文件=文件名.扩展名) 
文件名不能超过8个字节,如果多于8个字节,在DOS里不会被识别 
扩展名不能超过3个字节,如果多于3个字节,在DOS里不会被识别

1.2. 何为长文件名

文件名超出8个字节或扩展名超出3个字节都是长文件名 
FAT32文件系统完全支持长文件名,长文件名记录在目录项中,可能一个文件名占据多个目录项

1.3. 目录项

在 FAT32文件系统中,根据结构不同可以将目录项大致分为四种:卷标目录项、 “.”目录项和“..”目录项、短文件名目录项、长文件名目录项。短文件名目录项是最重要的数据结构,其中存放着有关子目录或文件的短文件名、属性、起始簇号、时间值以及内容大小等信息。在 FAT32 文件系统中,将子目录看作是一种特殊的文件

1.4. FAT32中短文件目录项

1.4.1. 短文件目录项特点

1.如果文件名不足8个则用0x20进行填充 
2.如果是子目录,则将扩展名部分用“0x20”进行填充 
3.每个文件或子目录都分配有一个大小为  32 字节的短文件目录项,用以描述文件或目录的属性 
4.要找到一个目录项的位置只能用分配给文件或子目录的全名进行是搜索 
5.一个目录项是否被分配使用由它的第一个字节来描述。对于已经分配使用的目录项,它的第一个字节是文件名的第一个字符,而文件或目录被删除后,它所对应的目录项的第一个字节将被置为0xE5,这就是为什么有的 FAT数据恢复工具需要用户自己输入文件名的第一个字符的原因

1.4.2. 短文件目录项定义

0x0-0x7:文件名,如果该目录项正在使用中0x0位置的值为文件名或子目录名的第一个字符,如果该目录项未被使用0x0位置的值为0x00,如果该目录项曾经被使用过但是现在已经被删除则0x0位置的值为0xE5
0x8-0xA:扩展名
0xB:描述文件的属性,该字段在短文件中不可取值0x0F,如果设置为0x0F则标志是长文件
0xC:1字节,保留 (这个位默认为0,只有短文件名时才有用.当为0x00时为文件名全大写,当为0x08时为文件名全小写;0x10时扩展名全大写,0x00扩展名全小写;当为0x18时为文件名全小写,扩展名全大写)
0xD:文件创建的时间-精确到十分之一秒
0xE-0xF:文件创建的时间-时分秒,16bit 被划分为 3个部分 
0~4bit 为秒,以 2秒为单位,有效值为 0~29,可以表示的时刻为 0~58  
5~10bit 为分,有效值为 0~59  
11~15bit 为时,有效值为 0~23
0x10-0x11:文件创建日期,16bit 也划分为三个部分 
0~4bit 为日,有效值为 1~31  
5~8bit 为月,有效值为 1~12  
9~15bit 为年,有效值为 0~127,这是一个相对于 1980 年的年数值,也就是说该值加上 1980即为文件创建的日期值。
0x12~0x13:2 个字节,最后访问日期。 
0x14~0x15:2 个字节,文件起始簇号的高两个字节。 
0x16~0x17:2 个字节,文件最后修改的时间。
0x18~0x19:2 个字节,文件最后被修改时的日期。 
0x1A~0x1B:文件内容起始簇号的低两个字节,与 0x14~0x15 字节处的高两个字节组成文件内容起始簇号。 
0x1C~0x1F:文件内容大小字节数,只对文件有效,子目录的目录项此处全部设置为 0。

1.5. FAT32中长文件目录项

1.5.1. 长文件目录项特点

为了低版本的OS或程序能正确读取长文件名文件,系统自动为所有长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址。不支持长文件名的OS或程序会忽略它认为不合法的长文件名字段,而支持长文件名的OS或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。
长文件名的实现有赖于目录项偏移为0xB的属性字节,当此字节的属性为:只读、隐藏、系统、卷标,即其值为0FH时,DOS和WIN32会认为其不合法而忽略其存在。这正是长文件名存在的依据。
系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。长文件名的第一部分距离短文件名目录项是最近的。
系统在存储长文件名时,总是先按倒序填充长文件名目录项,然后紧跟其对应的短文件名。长文件名中并不存储对应文件的文件开始簇、文件大小、各种时间和日期属性。文件的这些属性还是存放在短文件名目录项中,一个长文件名总是和其相应的短文件名一一对应,短文件名没有了长文件名还可以读,但长文件名如果没有对应的短文件名,不管什么系统都将忽略其存在。所以短文件名是至关重要的。在不支持长文件名的环境中对短文件名中的文件名和扩展名字段作更改(包括删除,因为删除是对首字符改写E5H),都会使长文件名形同虚设。

1.5.2. 长转短文件名规则

当创建一个长文件名文件时,系统会自动加上对应的短文件名,其一般有的原则: 
    (1)、取长文件名的前6个字符加上”~1”形成短文件名,扩展名不变。 
    (2)、如果已存在这个文件名,则符号”~”后的数字递增,直到5。 
    (3)、如果文件名中”~”后面的数字达到5,则短文件名只使用长文件名的前两个字母。通过数学操纵长文件名的剩余字母生成短文件名的后四个字母,然后加后缀”~1”直到最后(如果有必要,或是其他数字以避免重复的文件名)。 
    (4)、如果存在老OS或程序无法读取的字符,换以”_”

1.5.3. 长文件目录名定义

长文件名中的字符采用unicode形式编码,每个字符占据2字节的空间。其目录项定义如下:

0x00~0x00:1 个字节,长文件名目录项的序列号,一个文件的第一个目录项序列号为 1,然后依次递增。如果是该文件的最后一个长文件名目录项,则将该目录项的序号与 0x40 进行“或(OR)运算”的结果写入该位置。如果该长文件名目录项对应的文件或子目录被删除,则将该字节设置成删除标志0xE5。 
0x01~0x0A:10 个字节,长文件名的第 1~5 个字符。长文件名使用 Unicode 码,每个字符需要两个字节的空间。如果文件名结束但还有未使用的字节,则会在文件名后先填充两个字节的“00”,然后开始使用 0xFF 填充。 
0x0B~0x0B:1 个字节,长目录项的属性标志,一定是 0x0F。 
0x0C~0x0C:保留。 
0x0D~0x0D:1 个字节,校验和。如果一个文件的长文件名需要几个长文件名目录项进行存储,则这些长文件名目录项具有相同的校验和。 
0x0E~0x19:12 个字节,文件名的第 6~11 个字符,未使用的字节用 0xFF 填充。
0x1A~0x1B:2 个字节,保留。
0x1C~0x1F:4 个字节,文件名的第 12~13 个字符,未使用的字节用 0xFF 填充。

1.6. 长短文件名如何配对

长文件名和短文件名之间的联系光靠他们之间的位置关系维系显然远远不够。其实,长文件名的0xD字节的校验和起很重要的作用,此校验和是用短文件名的11个字符通过一种运算方式来得到的。系统根据相应的算法来确定相应的长文件名和短文件名是否匹配 
如果通过短文件名计算出来的校验和与长文件名中的0xD偏移处数据不相等。系统无论如何都不会将它们配对的。
依据长文件名和短文件名对目录项的定义,加上对簇的编号和链接,FAT32上数据的读取便游刃有余了。

1.7. 送分题

1.7.1. “.”目录项和“..”目录项

“.”表示当前目录(下文中的子) 
“..”表示上级目录(下文中的父) 
一个子目录的起始簇,前两个目录项为“.”目录项和“..”目录项,子目录通过这两个目录项及它在父目录中的目录项建立起父子目录的联系。

“.”目录项位于子目录起始簇的第一个目录项位置,它用以表明该簇是一个子目录的起始簇。另外,该目录项实际上是对目录自身的描述,它记录了该子目录时间信息、起始簇号等。需要注意的是,它所记录的起始簇号也就是该子目录目前所处的位置。 
“..”目录项位于子目录起始簇的第二个目录项位置,用于描述该子目录的父目录的相关信息。

1.7.2. 卷标目录项

卷标名使用11个字节描述(目录项还是32字节咯),不足 11 个字节,则用 0x20 填充。(由于每个汉字占用 2 个字节空间,而卷标最多允许 11 个字节,所以用汉字命名卷标时,卷标的长度不能超过 5 个汉字)。

卷标目录项结构与普通短文件名目录项结构完全相同,但没有创建时间和访问时间,只有一个最后修改时间。 
另外,卷标目录项也没有起始簇号和大小值,这些字节位置全部这只为  0
0x0B  字节处的属性值为 0x08.
如果创建文件系统时指定了卷标,则会在根目录下第一个目录项的位置建立一个卷标目录项
卷标名最多允许占用长度为 11 个字节,也就是为短文件名分配的 11 个文件名区域

FATFS长短文件名解析相关推荐

  1. linux源码文件名,Linux中文件名解析处理源码分析

    Linux中文件名解析处理源码分析 前言 Linux中对一个文件进行操作的时候,一件很重要的事情是对文件名进行解析处理,并且找到对应文件的inode对象,然后创建表示文件的file对象.在此,对文件名 ...

  2. 全网首发:VS编译出错:两个输出文件名解析为同一个输出路径

    具体错误: 1>------ 已启动全部重新生成: 项目: TsOfficeInstaller-final, 配置: Debug Any CPU ------ 1>C:\Windows\M ...

  3. php文件名解析漏洞 nginx,nginx服务器解析漏洞(一)

    Nginx解析漏洞: 影响版本:全版本 影响说明:命令执行,获取服务器web权限 环境说明:Nginx 1.13.0 环境搭建: 此次环境使用docker环境搭建,环境采用地址>Vulhub 遇 ...

  4. 两个输出文件名解析为同一输出路径_解析 crash log(一)

    前言 在负责的产品中有最近一段时间有极个别用户老是反馈有偶尔闪退的情况,而且就这几个用户反复出现,其它用户,甚至就坐在他边上的用户进行了一样的操作都没有任何问题. 刚开始丢了个重现构建的新包给这几位用 ...

  5. mv或者cp带小括号文件名解析问题总结

    2019独角兽企业重金招聘Python工程师标准>>> 例:mv test_file (1).xls 报错: bash: 未预期的符号 `(' 附近有语法错误解决方案: mv tes ...

  6. Apache[多后缀文件名解析漏洞+换行解析漏洞+SSI远程命令执行漏洞]复现

    目录 一.多后缀文件解析漏洞 二.Apache换行解析漏洞(CVE-2017-15715) 三.Apache SSI 远程命令执行漏洞

  7. c# 错误 两个输出文件名解析为同一个输出路径

    检查同项目的其他文件夹下面已有其他同名窗体,影响设计器 转载于:https://www.cnblogs.com/xiaxiaolu/p/4367166.html

  8. nginx 上传文件漏洞_文件上传及解析漏洞

    注:本文仅供学习参考 文件上传定义: 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行.这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等. 这种攻击方式是最为直接和有效的, ...

  9. kubernetes日志采集与解析

    需求:当我们创建deployment后,我们希望能够收集到这些deployment每个pod的终端日志,并且能够通过deployment的名字以及pod的名字进行过滤 日志方案 filebeat -& ...

最新文章

  1. python argv 详解_Python3 sys.argv[ ]用法详解
  2. 机器人产业这些领域大有可为
  3. 被微软称为 “世界的电脑” ,Azure 到底有多牛?
  4. WPF 4.0 DatePicker 快速录入
  5. Android--视频播放器
  6. 比起第一代,《最后生还者2》到底做错了什么?
  7. 注解不自动导包_玩转SpringBoot2.X:SpringBoot自动配置原理大揭秘
  8. spring mvc学习(31):原生api
  9. Mariadb升级到mysql_mariadb的版本升级方法
  10. angularjs过滤器(number)
  11. 使用C#将RGB24转换为YUV420格式
  12. 读懂西瓜书 14 : 概率图模型
  13. sis最新地址获取方法_微信表情悄悄更新,获取最新表情方法!
  14. Linux 下重新挂载分区方法
  15. Java二维码图片处理
  16. cos66度等于多少度 用计算机怎么算,三角函数值表(三角函数计算方法及快速查询表)...
  17. scrapy豆瓣爬虫mysql存储名字有图片的问题(关于utf8mb4)
  18. 太极root权限_太极下载无需root
  19. JAVA JDK最详细的安装教程--你只需要看这篇就够了
  20. 动画animation

热门文章

  1. gitlab安装完成后注册新用户
  2. 月光のカルネヴァーレ 汉化补丁
  3. 什么是显微镜摄像头,以及显微镜摄像头的作用
  4. iOS 第三方库汇总(超全!!!!)
  5. 计算机管理服务游戏,Win10全新任务管理器上线:专为PC游戏优化
  6. 深度剖析集成学习GBDT
  7. 福利来了 - 分享保时捷 Porsche EDI 项目 (一)
  8. 深耕中国、投资中国、服务中国,斯凯奇斥资30亿元建设中国物流中心 | 美通社头条...
  9. 大虫罗德曼的打球视频
  10. 工作负载型控制器的应用