FAT32 ограничение на количество файлов в каталоге

В настоящее время я пытаюсь закодировать систему FAT в C на карте Xillinx Kintex 7. Он оснащен MicroBlaze, и мне уже удалось создать большинство необходимых функций.

Проблема, с которой я столкнулся, связана с общей емкостью папки. Я читал в Интернете, что в FAT32 папка должна содержать более 65 000 файлов, но с установленной системой я ограничено 509 файлами в папке. Я думаю, это из-за моего понимания того, как работает FAT32, но вот что я сделал до сих пор:

  • Я создал функцию форматирования, которая записывает правильные данные в MBR (сектор 0) и идентификатор тома (сектор 2048 на моем диске).
  • Я создал функцию, которая записывает содержимое корневого каталога (первый кластер, который начинается в секторе 124 148)
  • Я создал функцию, которая записывает новую папку, содержащую N файлов размера X. Имя папки записывается в корневом каталоге (сектор 124148), а имена файлов записываются в следующем кластере (сектор 124212, так как я установите размер кластера на 64 сектора). Наконец, содержимое файлов (простой счетчик) записывается в следующий кластер, который начинается с сектора 124276.

Здесь дело в том, что папка имеет размер 1 кластер, что означает, что она имеет емкость 64 сектора = 32 КБ, и я могу создать только 512 (минус 2) файлов в каталоге! Тогда мой вопрос: можно ли изменить размер папки в количестве кластера? В настоящее время я использую только 1 кластер, и я не понимаю, как его изменить. Это связано с FAT диска?

Заранее спасибо за помощь!

ПРИМЕЧАНИЕ. Мой диск распознается Windows, когда я подключаю его, я могу получить доступ и прочитать каждый файл (кроме тех, которые превышают ограничение 510), и я могу создавать новые файлы через проводник Windows. Очевидно, это происходит из-за того, как я понимаю создание файлов и создание папок!


person Arthur Penguin    schedule 10.05.2016    source источник
comment
Как вы обрабатываете файлы, размер которых превышает один кластер?   -  person Neil    schedule 10.05.2016
comment
Я пытался сделать это простым и избежать фрагментации каждого файла, в настоящее время файлы хранятся последовательно, а FAT указывает непосредственно на следующий кластер (6-й указывает на 7-й и так далее до конца файла 0xFFFFFF0F), что означает, что сначала место под файл резервируется в кластерах и соответственно прописывается FAT, потом записываю данные в файлы. Из вашего вопроса я так понял, что папки работают одинаково, так ли это? Тогда можно ли зарезервировать, скажем, 16 кластеров (примерно 8160 файлов) и соответственно настроить FAT? Спасибо!   -  person Arthur Penguin    schedule 10.05.2016


Ответы (2)


Каталог в файловой системе FAT — это всего лишь особый тип файла. Поэтому используйте больше кластеров для этого «файла», как и для любого другого файла.

Номер кластера корневого каталога хранится по смещению 0x2c заголовка FAT32 и обычно равен 2. Запись в карте кластера для кластера 2 содержит значение 0x0FFFFFFF (конец кластера), если это единственный кластер для корневого каталога. Вы можете использовать два кластера (например, кластер 2 и кластер 3) для корневого каталога, если вы установите кластер 3 в карте кластера в качестве следующего кластера для кластера 2 (установите 0x00000003 в качестве значения для записи кластера 2 в карте кластера). Теперь кластер 3 может быть либо последним кластером (путем установки его записи в 0x0FFFFFFF), либо, в свою очередь, указывать на другой кластер, чтобы сделать пространство для корневого каталога еще больше.

Кластеры не обязательно должны быть последовательными, но обычно это дает прирост производительности при последовательном чтении (поэтому дефрагментация тома может значительно увеличить производительность).

person Ctx    schedule 10.05.2016
comment
Я попытался воспроизвести ту же функцию, которую я создал для создания файла, и все работает правильно, спасибо за вашу помощь! - person Arthur Penguin; 11.05.2016

Максимальное количество файлов в каталоге файловой системы FAT составляет 65 536, если все файлы имеют короткие имена файлов (формат 8.3). Короткие имена файлов хранятся в одной 32-байтовой записи.

Это означает, что максимальный размер каталога (файла) составляет 65 536 * 32 байта, то есть 2 097 152 байта.

Короткие имена файлов в формате 8.3 состоят из 8 символов плюс необязательное "." за которым следуют максимум 3 символа. Набор символов ограничен. Короткие имена файлов, содержащие строчные буквы, дополнительно сохраняются в записи длинного имени файла.

Если имя файла длиннее (длинное имя файла), оно распределяется по нескольким записям длиной 32 байта. Каждая запись содержит 13 символов имени файла. Если длина имени файла не кратна 13, последняя запись дополняется.

Кроме того, существует одна запись короткого имени файла для каждой записи длинного имени файла.

2 32-байтовые записи уже заняты "." и ".." записи в каждом каталоге (кроме корневого).

1 32-байтовая запись считается конечным маркером?

Таким образом, фактическое максимальное количество файлов в каталоге зависит от длины имен файлов.

person katce    schedule 23.04.2020