FAT32每个目录限制的文件数

时间:2016-05-10 10:03:41

标签: c file directory limit fat32

我正在尝试在Xillinx Kintex 7卡上用C编码FAT系统。它配备了MicroBlaze,我已经设法创建了大部分所需的功能。

我面临的问题是关于文件夹的总容量,我在网上看到,在FAT32中,一个文件夹应该能够包含超过65000个文件但是我已经安装了系统我每个文件夹限制为509个文件。我认为这是因为我理解了FAT32的工作方式,但这是我迄今为止所做的:

  • 我创建了一个格式化函数,它将正确的数据写入MBR(扇区0)和卷ID(我的磁盘上的扇区2048)。
  • 我创建了一个函数,用于写入根目录的内容(第一个集群在124号扇区148上开始)
  • 我创建了一个函数,用于写入包含大小为X的N个文件的新文件夹。文件夹的名称写在根目录(扇区124148)中,文件名写在下一个簇(扇区124212,因为我已将簇大小设置为64个扇区)。最后,文件的内容(一个简单的计数器)写在从扇区124276开始的下一个簇上。

这里的问题是文件夹的大小为1簇,这意味着它的容量为64扇区= 32KB,我只能在目录中创建512(减2)个文件!然后,我的问题是:是否可以更改群集数量的文件夹的大小?目前我只使用1个集群,我不明白如何更改它。它与驱动器的FAT有关吗?

提前感谢您的帮助!

注意:当我将其插入时,Windows会识别我的驱动器,我可以访问和读取每个文件(超出510限制的文件除外),我可以通过Windows资源管理器创建新文件。它显然来自我理解文件创建和文件夹创建的方式!

2 个答案:

答案 0 :(得分:3)

FAT文件系统中的目录只是一种特殊类型的文件。因此,为此"文件"使用更多集群。就像你对任何其他文件一样。

根目录的群集号存储在FAT32头的偏移 0x2c 处,通常是群集 2 。如果这是根目录的唯一集群,则集群2的集群映射中的条目包含值0x0FFFFFFF(集群末尾)。如果将群集映射中的群集3设置为群集2的下一个群集(将0x00000003设置为群集2中的群集2的值,则可以将两个群集(例如群集2和3)用于根目录集群地图)。现在,集群3可以是最后一个集群(通过将其条目设置为0x0FFFFFFF),也可以指向另一个集群,以使根目录的空间更大。

群集不需要是后续的,但它通常会在顺序读取时获得性能提升(这就是为什么对卷进行碎片整理会大大提高性能的原因)。

答案 1 :(得分:0)

如果所有文件都具有短文件名(8.3格式),则FAT文件系统目录中的最大文件数为65,536。短文件名存储在一个32字节的条目中。

这意味着目录(文件)的最大大小为65,536 * 32字节,即2,097,152字节。

8.3格式的短文件名由8个字符和可选的“。”组成。随后最多3个字符。字符集是有限的。包含小写字母的短文件名还存储在“长文件名”条目中。

如果文件名较长(长文件名),则文件名分布在多个32字节长的条目中。每个条目包含文件名的13个字符。如果文件名的长度不是13的倍数,则填充最后一个条目。

此外,每个长文件名条目都有一个短文件名条目。

2个32字节条目已经被“。”占用。和每个目录(根目录除外)中的“ ..”条目。

是否将1个32字节的条目用作结束标记?

因此,目录中文件的实际最大数量取决于文件名的长度。