FAT32 每个目录的文件数限制
FAT32 number of files per directory limit
我目前正尝试在 Xillinx Kintex 7 卡上用 C 编写 FAT 系统。它配备了 MicroBlaze,我已经设法创建了大部分所需的功能。
我面临的问题是关于一个文件夹的总容量,我在网上读到在 FAT32 中一个文件夹应该能够包含超过 65 000 个文件,但是在我放置的系统中我限制每个文件夹 509 个文件。我认为这是因为我对 FAT32 工作方式的理解,但这是我到目前为止所做的:
- 我创建了一个格式化函数,可以将正确的数据写入 MBR(扇区 0)和卷 ID(我磁盘上的扇区 2048)。
- 我创建了一个写入根目录内容的函数(第一个从扇区 124 148 开始的簇)
- 我创建了一个函数,用于写入一个包含 N 个大小为 X 的文件的新文件夹。文件夹的名称写入根目录(扇区 124148),文件名写入下一个簇(扇区) 124212,因为我已将簇大小设置为 64 个扇区)。最后,文件的内容(一个简单的计数器)被写入从扇区 124276 开始的下一个簇。
在这里,问题是一个文件夹的大小为 1 个簇,这意味着它的容量为 64 个扇区 = 32KB,我只能在一个目录中创建 512(减去 2)个文件!然后,我的问题是:是否可以根据簇数更改文件夹的大小?目前我只使用 1 个集群,我不知道如何更改它。与驱动器的FAT有关吗?
在此先感谢您的帮助!
注意:当我插入驱动器时,我的驱动器被 Windows 识别,我可以访问和读取每个文件(超出 510 限制的文件除外)并且我可以通过 Windows 资源管理器。这显然来自我对文件创建和文件夹创建的理解方式!
FAT文件系统中的目录只是一种特殊类型的文件。因此,就像处理任何其他文件一样,为此 "file" 使用更多的簇。
根目录的簇号存放在FAT32头的偏移量0x2c处,通常是簇 2。如果这是根目录的唯一集群,则集群 2 的集群映射中的条目包含值 0x0FFFFFFF
(集群结束)。如果在集群映射中将集群 3 设置为集群 2 的下一个集群(将 0x00000003
设置为集群 2 的条目的值,则可以将两个集群(例如集群 2 和 3)用作根目录聚类图)。现在,集群 3 可以是最后一个集群(通过将其条目设置为 0x0FFFFFFF
),也可以依次指向另一个集群,以使根目录的 space 更大。
集群不需要是后续的,但它通常在顺序读取上有性能提升(这就是为什么对卷进行碎片整理可以大大提高性能)。
如果所有文件都具有短文件名(8.3 格式),则 FAT 文件系统目录中的最大文件数为 65,536。短文件名存储在一个 32 字节的条目中。
这意味着一个目录(文件)的最大大小为 65,536 * 32 字节,即 2,097,152 字节。
8.3 格式的短文件名由 8 个字符加上可选的“.”组成。后跟最多 3 个字符。字符集是有限的。包含小写字母的短文件名额外存储在长文件名条目中。
如果文件名较长(长文件名),则它分布在多个 32 字节长的条目中。每个条目包含文件名的 13 个字符。如果文件名的长度不是 13 的倍数,则填充最后一个条目。
此外,每个长文件名条目都有一个短文件名条目。
2 个 32 字节条目已被“.”占用和每个目录中的“..”条目(根目录除外)。
1 32字节条目作为结束标记?
因此目录中的实际最大文件数取决于文件名的长度。
我目前正尝试在 Xillinx Kintex 7 卡上用 C 编写 FAT 系统。它配备了 MicroBlaze,我已经设法创建了大部分所需的功能。
我面临的问题是关于一个文件夹的总容量,我在网上读到在 FAT32 中一个文件夹应该能够包含超过 65 000 个文件,但是在我放置的系统中我限制每个文件夹 509 个文件。我认为这是因为我对 FAT32 工作方式的理解,但这是我到目前为止所做的:
- 我创建了一个格式化函数,可以将正确的数据写入 MBR(扇区 0)和卷 ID(我磁盘上的扇区 2048)。
- 我创建了一个写入根目录内容的函数(第一个从扇区 124 148 开始的簇)
- 我创建了一个函数,用于写入一个包含 N 个大小为 X 的文件的新文件夹。文件夹的名称写入根目录(扇区 124148),文件名写入下一个簇(扇区) 124212,因为我已将簇大小设置为 64 个扇区)。最后,文件的内容(一个简单的计数器)被写入从扇区 124276 开始的下一个簇。
在这里,问题是一个文件夹的大小为 1 个簇,这意味着它的容量为 64 个扇区 = 32KB,我只能在一个目录中创建 512(减去 2)个文件!然后,我的问题是:是否可以根据簇数更改文件夹的大小?目前我只使用 1 个集群,我不知道如何更改它。与驱动器的FAT有关吗?
在此先感谢您的帮助!
注意:当我插入驱动器时,我的驱动器被 Windows 识别,我可以访问和读取每个文件(超出 510 限制的文件除外)并且我可以通过 Windows 资源管理器。这显然来自我对文件创建和文件夹创建的理解方式!
FAT文件系统中的目录只是一种特殊类型的文件。因此,就像处理任何其他文件一样,为此 "file" 使用更多的簇。
根目录的簇号存放在FAT32头的偏移量0x2c处,通常是簇 2。如果这是根目录的唯一集群,则集群 2 的集群映射中的条目包含值 0x0FFFFFFF
(集群结束)。如果在集群映射中将集群 3 设置为集群 2 的下一个集群(将 0x00000003
设置为集群 2 的条目的值,则可以将两个集群(例如集群 2 和 3)用作根目录聚类图)。现在,集群 3 可以是最后一个集群(通过将其条目设置为 0x0FFFFFFF
),也可以依次指向另一个集群,以使根目录的 space 更大。
集群不需要是后续的,但它通常在顺序读取上有性能提升(这就是为什么对卷进行碎片整理可以大大提高性能)。
如果所有文件都具有短文件名(8.3 格式),则 FAT 文件系统目录中的最大文件数为 65,536。短文件名存储在一个 32 字节的条目中。
这意味着一个目录(文件)的最大大小为 65,536 * 32 字节,即 2,097,152 字节。
8.3 格式的短文件名由 8 个字符加上可选的“.”组成。后跟最多 3 个字符。字符集是有限的。包含小写字母的短文件名额外存储在长文件名条目中。
如果文件名较长(长文件名),则它分布在多个 32 字节长的条目中。每个条目包含文件名的 13 个字符。如果文件名的长度不是 13 的倍数,则填充最后一个条目。
此外,每个长文件名条目都有一个短文件名条目。
2 个 32 字节条目已被“.”占用和每个目录中的“..”条目(根目录除外)。
1 32字节条目作为结束标记?
因此目录中的实际最大文件数取决于文件名的长度。