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年的时候比较火,现在差不多都修复了,抓到一条漏网之鱼, 短文件名漏 ...
随机推荐
- 第三十七节,hashlib加密模块
在使用hashlib模块时需要先 import hashlib 引入模块 用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA ...
- PHP 5 数据类型
本页内容来自http://www.runoob.com/php/php-datatypes.html String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型 ...
- 新建web project不自动生成web.xml解决方案
一步一步建立Web Project ,第3步会有 “Generate Web.xml deployment descriptor”,默认没勾选,勾上就行了
- hdu_5763_Another Meaning(dp)
题目链接:hdu_5763_Another Meaning 题意: 一个文本串A,一个模式串B,如果文本串含有模式串B,那么就能组合成多种意思,如下: In the first case, “ heh ...
- hdu_5742_It's All In The Mind
题目链接:hdu_5742_It's All In The Mind 题意: 有一个部分的数列,让你找一个满足他给的三个条件的数列,使前两个数的和除这个数列的sum最大 题解: xjb贪心一下就行了. ...
- mysql中AES_ENCRYPT、AES_DNCRYPT及CONVERT的用法
这两天在弄公司的服务端项目的时候,发现mysql比较实用的3个函数,在这里给大家分享一下. 1.AES_ENCRYPT函数,这个函数的使用场景是对一些安全性要求比较高的数据使用AES加密,语法为: A ...
- 关于table参数的一些问题
1.关于单元格合并 写在td标签上,如: <td rowspan="3"></td> 跨行合并:rowspan 跨列合并:colspan 2.关于多行输入框 ...
- PHP之输出控制 ob_start(),ob_get_contents(),ob_end_clean()
1.常用函数 ob_start();#打开输出缓冲区 ob_get_contents();#获取缓冲区内容 ob_get_length();#获取缓冲区内容长度 ob_clean();#清除之前的所有 ...
- QML中MouseArea元素的介绍
原文:http://www.thisisqt.com/?action-viewnews-itemid-22 MouseArea元素的一个很典型的用法是和一个可视的item一起用,处理这个item的鼠标 ...
- IOS中Label根据上个label的内容设置下个label的frame
#import "ViewController.h" @interface ViewController () @property(nonatomic,strong)UILabel ...