FAT32目录下的文件数量限制是多少?

4
我目前正在尝试在Xillinx Kintex 7卡上使用C编码FAT系统。它配备了MicroBlaze,我已经成功创建了大部分所需功能。但我遇到的问题是关于文件夹的总容量,我从网上了解到,在FAT32中,一个文件夹应该能够包含超过65,000个文件,但我却被限制为每个文件夹509个文件。我认为这是因为我对FAT32工作原理的理解有误。以下是我已经实现的内容:
我创建了一个格式化函数,可以将正确的数据写入MBR(扇区0)和卷ID(磁盘上的第2048个扇区)。
我创建了一个函数,用于写入根目录的内容(从第124148个扇区开始的第一个簇)。
我创建了一个函数,用于编写一个包含N个大小为X的文件的新文件夹。文件夹的名称写在根目录(扇区124148)中,并且文件名写在下一个簇(扇区124212,因为我将簇大小设置为64个扇区)。最后,文件内容(一个简单的计数器)被写入下一个从扇区124276开始的簇中。
这里的问题是,一个文件夹的大小为1个簇,这意味着它的容量为64个扇区= 32KB,我只能在一个目录中创建512(减去2)个文件!那么,我的问题是:是否可以更改文件夹的簇数?目前我只使用了1个簇,我不明白如何更改它。与驱动器的FAT有关吗?
注意:当我将驱动器插入Windows时,它被识别并且我可以访问和读取每个文件(除超过510限制的文件外),我也可以通过Windows资源管理器创建新文件。问题显然在于我对文件和文件夹创建的理解方式不正确!

你如何处理大于一个簇的文件? - Neil
我尽力保持简单,避免分割每个文件。目前,文件是按顺序存储的,FAT 直接指向下一个簇(第6个指向第7个,以此类推,直到文件结束为止0xFFFFFF0F),这意味着首先在簇中保留文件空间,然后相应地编写 FAT,然后再将数据写入文件。从您的问题中,我了解到文件夹的工作方式也是如此,是这样吗?那么,是否可以预留16个簇(大约8160个文件)并相应地设置 FAT?谢谢! - Arthur Penguin
2个回答

3
在FAT文件系统中,目录只是一种特殊类型的文件。因此,与任何其他文件一样,使用更多的簇来存储这个“文件”。
根目录的簇号存储在FAT32头的偏移量0x2c处,通常为簇2。簇映射表中簇2的条目包含值0x0FFFFFFF(簇结束),如果这是根目录的唯一簇。如果将簇3设置为簇2的下一个簇(将0x00000003设置为簇映射表中簇2的条目的值),则可以使用两个簇(例如簇2和3)来存储根目录。现在,簇3可以是最后一个簇(通过将其条目设置为0x0FFFFFFF),也可以依次指向另一个簇,以使根目录的空间变得更大。
这些簇不需要连续,但在顺序读取时通常会有性能提升(这就是为什么对卷进行碎片整理可以大幅提高性能的原因)。

我尝试复制我为文件创建所创建的相同函数,一切都正常工作,感谢您的帮助! - Arthur Penguin

2
FAT文件系统中,如果所有文件都是短文件名(8.3格式),则一个目录中的最大文件数为65,536个。短文件名存储在单个32字节条目中。
这意味着一个目录(文件)的最大大小为65,536 * 32字节,即2,097,152字节。
8.3格式的短文件名由8个字符组成,后面可跟一个".",再加上最多3个字符。字符集有限。包含小写字母的短文件名还会额外存储在长文件名条目中。
如果文件名更长(长文件名),则分布在多个32字节长的条目中。每个条目包含文件名的13个字符。如果文件名长度不是13的倍数,则最后一个条目会被填充。
此外,每个长文件名条目还有一个对应的短文件名条目。
每个目录(除根目录外)中的“.”和“..”条目已经占用了2个32字节的条目。
1个32字节的条目被用作结束标记。
因此,一个目录中实际的最大文件数取决于文件名的长度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接