FAT32系统中长文件名的存储(转)
FAT32的一个重要的特点是完全支持长文件名。长文件名依然是记录在目录项中的。
为了低版本的OS或程序能正确读取长文件名文件,系统自动为所有长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址。不支持长文件名的OS或程序会忽略它认为不合法的长文件名字段,而支持长文件名的OS或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。
当创建一个长文件名文件时,系统会自动加上对应的短文件名,其一般有的原则: (1)、取长文件名的前6个字符加上"~1"形成短文件名,扩展名不变。 (2)、如果已存在这个文件名,则符号"~"后的数字递增,直到5。 (3)、如果文件名中"~"后面的数字达到5,则短文件名只使用长文件名的前两个字母。通过数学操纵长文件名的剩余字母生成短文件名的后四个字母,然后加后缀"~1"直到最后(如果有必要,或是其他数字以避免重复的文件名)。 (4)、如果存在老OS或程序无法读取的字符,换以"_"
短文件格式的目录项。其参数意义见表14:
| 表14 FAT32短文件目录项32个字节的表示定义 | |||
| 字节偏移(16进制) | 字节数 | 定义 | |
| 0x0~0x7 | 8 | 文件名 | |
| 0x8~0xA | 3 | 扩展名 | |
| 0xB* | 1 | 属性字节 | 00000000(读写) |
| 00000001(只读) | |||
| 00000010(隐藏) | |||
| 00000100(系统) | |||
| 00001000(卷标) | |||
| 00010000(子目录) | |||
| 00100000(归档) | |||
| 0xC | 1 | 系统保留 | |
| 0xD | 1 | 创建时间的10毫秒位 | |
| 0xE~0xF | 2 | 文件创建时间 | |
| 0x10~0x11 | 2 | 文件创建日期 | |
| 0x12~0x13 | 2 | 文件最后访问日期 | |
| 0x14~0x15 | 2 | 文件起始簇号的高16位 | |
| 0x16~0x17 | 2 | 文件的最近修改时间 | |
| 0x18~0x19 | 2 | 文件的最近修改日期 | |
| 0x1A~0x1B | 2 | 文件起始簇号的低16位 | |
| 0x1C~0x1F | 4 | 表示文件的长度 | |
|
* 此字段在短文件目录项中不可取值0FH,如果设值为0FH,目录段为长文件名目录段 |
长文件名的实现有赖于目录项偏移为0xB的属性字节,当此字节的属性为:只读、隐藏、系统、卷标,即其值为0FH时,DOS和WIN32会认为其不合法而忽略其存在。这正是长文件名存在的依据。
将目录项的0xB置为0F,其他就任由系统定义了,Windows9x或Windows 2000、XP通常支持不超过255个字符的长文件名。
系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。 长文件名中的字符采用unicode形式编码(一个巨大的进步哦),每个字符占据2字节的空间。其目录项定义如表15。
| 表15 FAT32长文件目录项32个字节的表示定义 | ||||
| 字节偏移 (16进制) | 字节数 | 定义 | ||
| 0x0 | 1 | 属性字节位意义 | 7 | 保留未用 |
| 6 | 1表示长文件最后一个目录项 | |||
| 5 | 保留未用 | |||
| 4 | 顺序号数值 | |||
| 3 | ||||
| 2 | ||||
| 1 | ||||
| 0 | ||||
| 0x1~0xA | 10 | 长文件名unicode码① | ||
| 0xB | 1 | 长文件名目录项标志,取值0FH | ||
| 0xC | 1 | 系统保留 | ||
| 0xD | 1 | 校验值(根据短文件名计算得出) | ||
| 0xE~0x19 | 12 | 长文件名unicode码② | ||
| 0x1A~0x1B | 2 | 文件起始簇号(目前常置0) | ||
| 0x1C~0x1F | 4 | 长文件名unicode码③ | ||
系统在存储长文件名时,总是先按倒序填充长文件名目录项,然后紧跟其对应的短文件名。从表15可以看出,长文件名中并不存储对应文件的文件开始簇、文件大小、各种时间和日期属性。文件的这些属性还是存放在短文件名目录项中,一个长文件名总是和其相应的短文件名一一对应,短文件名没有了长文件名还可以读,但长文件名如果没有对应的短文件名,不管什么系统都将忽略其存在。所以短文件名是至关重要的。
在不支持长文件名的环境中对短文件名中的文件名和扩展名字段作更改(包括删除,因为删除是对首字符改写E5H),都会使长文件名形同虚设。
(长文件名如何与短文件名对应?仅靠她们之间的位置关系?)
长文件名和短文件名之间的联系光靠他们之间的位置关系维系显然远远不够。其实,长文件名的0xD字节的校验和起很重要的作用,此校验和是用短文件名的11个字符通过一种运算方式来得到的。系统根据相应的算法来确定相应的长文件名和短文件名是否匹配。这个算法不太容易用公式说明,我们用一段c程序来加以说明。 假设文件名11个字符组成字符串shortname[],校验和用chknum表示。得到过程如下:
int i,j,chknum=0; for (i=11; i>0; i--) chksum = ((chksum & 1) ? 0x80 : 0) + (chksum >> 1) + shortname[j++];
如果通过短文件名计算出来的校验和与长文件名中的0xD偏移处数据不相等。系统无论如何都不会将它们配对的。 依据长文件名和短文件名对目录项的定义,加上对簇的编号和链接,FAT32上数据的读取便游刃有余了。
本文出自数据恢复网(www.sjhf.net),疏漏在所难免,希望指正。
若需转载请保留此信息;
若需修改,请用以下方式与作者取得联系
FAT32系统中长文件名的存储(转)的更多相关文章
- 【原创】FAT32系统硬盘的数据恢复实例,这篇文章也是从自己QQ空间的,转移过来的
FAT32系统硬盘的数据恢复实例软件:win hex(16进制的编辑器)恢复内容:在FAT32中恢复一张图片1.首先我们格式化一个分区为空,让分区的系统选为FAT32系统格式化.如下: psb.jpg ...
- LINUX系统下添加映射存储LUN
LINUX系统下添加映射存储LUN(无需重启) 背景:Oracle rac环境 添加新实例,重新划分存储空间,从存储映射新的LUN. 问题:映射后,linux操作系统无法识别新的LUN,不能重启系统, ...
- [Perl]Windows 系统 Unicode 文件名操作(新建、重命名、枚举、复制)全攻略
[Perl] Windows 系统 Unicode 文件名操作(新建.重命名.枚举.复制)全攻略 环境 XP/WIN7 Perl v5.16 编辑整理:PerlMonk.523066680 常见的那些 ...
- 将windows系统装到USB存储设备
需求: 1)一般公司比较规范,计算机系统有严格的限制策略,如果自己不懂得如何更改或者没有权限更改,将极其不便. 2)计划在家里完成在公司未完成的事,甚至异地出差觉得携带笔记本不太方便,寻找更便携的设备 ...
- SD卡与FAT32系统学习
2011-06-06 23:04 前2天,我了解了一下SD卡驱动的原理及FAT32文件系统的结构.接着准备主要已移植为主.通过LCD显示SD卡中的图片.但我需要分步进行. 0,使sd卡能读写数据.1, ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之存储模型
1.前言 关于存储系统体系架构,可以概述如下: 存储系统体系结构的形式 VMSA 存储属性 2. 存储系统体系结构 2.1. 地址空间 指令地址空间溢出 指令地址计算((address_of ...
- Android系统中长按事件的实现机制解析
在Android的触摸消息中,已经实现了三种监测,它们分别是 1)pre-pressed:对应的语义是用户轻触(tap)了屏幕 2)pressed:对应的语义是用户点击(press)了屏幕 3)lon ...
- centos 7.1系统更改Mariadb数据存储位置步骤分享
一.首先确保你要更改Mariadb数据存储的位置的空间够大 现在已将Mariadb存储位置更改到/opt/目录下 1.然后将Mariadb服务stop:systemctl stop mariadb 2 ...
- IIS系统短文件名漏洞猜解过程
今天看教程的时候,老师关于后台管理说到了短文件名漏洞,我就随便找了个网站猜解,可能是运气太好了,有了这次实践的过程,因为这个漏洞是13年的时候比较火,现在差不多都修复了,抓到一条漏网之鱼, 短文件名漏 ...
随机推荐
- Robot Framework开发系统关键字详细
本文的目的,是记录如何在rf下,开发属于自己的库函数(又称之系统关键字) 1.首先在..\Python27\Lib\site-packages目录下创建自定义库目录如Verification_Libr ...
- linux文件特殊属性介绍(s,s,t)
文件的权限有rwx这3个读.写.执行的权限.但是,怎么 /tmp权限有些奇怪?还有, /usr/bin/passwd也有些奇怪,怎么回事呢? [root@linux ~]# ls -ld /tmp ; ...
- 解决mac下atom安装插件失败问题
activate-power-mode的超炫编辑效果打动了我,花时间安装了atom,之后在package,install里面找到了这个插件,但是安装失败,如下图所示: gyp info it work ...
- Away 3d 入门demo
Away3d是不错的开源Flash 3D引擎,现在最新的版本是4.0,在这个例子中我们使用现在比较稳定的3.6版本,4.0API相较之前变化较大,支持最新的flash player11硬件加速 现在写 ...
- 后台数据download成excel的方法(controller/action)
jsp页面端 <a href="/portal/server/importExec" title="Data Download"> <img ...
- 贪心+树状数组维护一下 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D
http://codeforces.com/contest/724/problem/D 题目大意:给你一个串,从串中挑选字符,挑选是有条件的,按照这个条件所挑选出来的字符集合sort一定是最后选择当中 ...
- gre tunnel
http://searchenterprisewan.techtarget.com/tip/GRE-tunnel-vs-IPsec-tunnel-What-is-the-difference Enca ...
- FileSystemXmlApplicationContext方法的绝对路径问题
public AgentServer(Socket c,String confDir) { this.client = c; ApplicationContext ac = new FileSyste ...
- Spring Boot 系列教程2-Data JPA
Spring Data JPA 用来简化创建 JPA 数据访问层和跨存储的持久层功能. 官网文档连接 http://docs.spring.io/spring-data/jpa/docs/curren ...
- CodeForces 510B DFS水题
题目大意:在图中找到一个字符可以围成一个环(至少有环四个相同元素) 题目思路:对当前点进行搜索,如果发现可以达到某个已经被查找过的点,且当前点不是由这个点而来,则查找成功. #include<c ...