为什么会有 U 盘单个文件不可以超过 4GB?计算机考古学第一期

为什么会有 U 盘单个文件不可以超过 4GB?计算机考古学第一期

AI朗读

我在某乎上看到这个问题。

的确,如果你的U盘使用默认的FAT32文件系统,当你复制超过4GB文件进去后,会提示:对于目标文件系统,文件XXX过大,这种提示,那么为什么会有这种情况呢?

图片[1]-为什么会有 U 盘单个文件不可以超过 4GB?计算机考古学第一期-倦意博客

历史背景

国人关于U盘和4GB限制这个问题,还要追溯到上个世纪末这个世纪初FAT32文件系统盛行的年代。那个时候正是微软Windows操作系统大举进入中国市场的时候,从经典的windows 95开始(OSR2版本)一直到几乎全民皆知的windows XP,FAT32文件系统在很长一段时间都是我们默认使用的文件系统。

这种“隐式的绑定使用”甚至在之后的一段时间里都让人们无法舍弃FAT32投奔到更先进的文件系统的行列,直到微软彻底将FAT32移除出安装时的默认文件系统,将NTFS作为必要的默认文件系统后,人们才开始大规模使用NTFS。但是由于诸多原因,很多移动设备(如U盘)还是默认使用的FAT32文件系统,所以人们的认知在各种片面性的知识传播中逐渐形成为“U盘的文件不能超过4GB”这种机械性的认知。

解释原因

由于普通用户的认识里基本没有文件系统这种虚拟概念的实际样子,所以很多人口中常常提到的就是肉眼可见的文件系统实际载体,比如硬盘、分区、U盘、软盘等等。所以就有了“U盘的单个文件不能超过4GB”的极其片面的“传说”。实际上这和U盘等设备没有直接关系,因为几乎所有的可写的存储介质都可以更换上面的文件系统,用不同的文件系统就会有不同特性和限制等。当然文件系统对于普通用户来说几乎是透明存在的,普通用户基本上只关心自己的文件能够正常存储和读写,根本不关心是怎么存储和读写的。

那么这既然不是U盘的锅,而是FAT32文件系统的锅,下面我们就说一下为什么FAT32会有这样的限制。这和FAT32的设计结构直接相关。

FAT32有很多基础结构,参考 Design_of_the_FAT_file_system。FAT32被分为四个大区域:


+-----------------------------------------------------------+
|  Reserved sectors |               FAT Region              |
+-------------------+---------------------------------------+
|             FAT Region #2             |                   |
+---------------------------------------+                   |
|                                                           |
|                                                           |
|                                                           |
|                        Data Region                        |
|                                                           |
|                                                           |
|                                                           |
|                                                           |
+-----------------------------------------------------------+

第一个区域一般用于过去的DOS boot sector和很多保留空间,第二个区域是数据区域的map,标识哪些clusters上分配了文件或目录等。第三个区域在FAT16或更早的时候有特别用途,后来在FAT32的时候被用作了第二个区域的备份,如果第二个区域出现corruption可以用第三个区域补救。最后一个区域就是最大最主要的数据区域,文件和目录的数据和元数据就存储在这里。

跟这个问题相关的是FAT32的最后一个区域——数据区(Data Region),数据区中存储着文件和目录等,而目录中存储着目录下面所有文件或子目录的条目信息。一个目录条目主要包括它下面存储的文件/子目录的名字、属性、存储位置以及大小等等。

按路径访问一个文件的基本过程是先定位到已知的根目录,从根目录的条目中获取到要访问的下一级子目录的位置,到这个位置去获取下下一级要访问的子目录的条目信息,依次类推,直到定位到最后一级要访问的文件或子目录。所以目录的条目非常重要,而目录条目(directory entries)的结构如下:

+----------------------------------------------------------+
| short file name | Short file extension | File Attributes |
+----------------------------------------------------------+
|            .................................             |
+----------------------------------------------------------+
| High cluster | ...... | Low cluster | File size in bytes |
+----------------------------------------------------------+

每个目录条目都是32字节长度,里面有很多区域,我就简写了。我们需要关注的是最后一个区域”File size in bytes”,顾名思义就是文件的大小(以字节为单位)。在设计FAT32的时候,它被设计为固定的4字节大小,也就是32个bit。这就是限制FAT32的文件大小不能超过4GB的根本原因,因为它限制了文件的size不能超过”2^32 – 1″ (2的32次方减1, ^表示乘方)个字节,也就是俗称的不能超过4GiB。超过4GB就超过了这个域能记录的最大长度,就会导致问题。

结语

注意以上说的仅限于FAT32系列的文件系统,其它文件系统的组织形式并不相同。而FAT32为什么只为文件size设计了4字节的存储空间呢?这和它当时的应用场景有很大关系,首先FAT32不是凭空出现的,它也是一点点演进而来的。而考虑用4字节的空间来存储文件大小对于上世纪末的民用计算机发展水平来说基本上绰绰有余,要知道那个时候软盘还是主要的移动存储介质。但是这种情况很快被计算机发展的速度打破,4GB文件大小的限制在现在看来简直不能接受,所以后面的文件系统优先就处理了这个问题。处理起来也很简单,就是给文件size多留几个字节(当然文件系统整体基本都重新设计了)。当然不管是什么文件系统,它的总大小和可存储的单个文件的大小都不会是无穷大的,但是别担心,至少目前都还是非常足够用的。

© 版权声明
THE END
喜欢就支持一下吧
点赞1 分享
评论 共3条

请登录后发表评论