Существует ли ограничение на количество файлов в каталоге на SD-карте?

У меня есть проект, написанный для Android-устройств. Он генерирует большое количество файлов каждый день. Это все текстовые файлы и изображения. Приложение использует базу данных для ссылки на эти файлы.

Приложение должно очищать эти файлы после небольшого использования (возможно, через несколько дней), но этот процесс может работать или не работать. Это не вопрос этого вопроса.

Из-за исторической аварии организация файлов несколько наивна: все в одном каталоге; a .hidden, который содержит файл с нулевым байтом .nomedia, чтобы предотвратить индексирование MediaScanner.

Сегодня я вижу сообщение об ошибке:

java.io.IOException: Cannot create: /sdcard/.hidden/file-4200.html
  at java.io.File.createNewFile(File.java:1263)

Что касается SD-карты, я вижу, что у нее осталось много памяти, но считая

$ cd /Volumes/NO_NAME/.hidden
$ ls | wc -w
9058

Удаление нескольких файлов, похоже, позволило продолжить создание файла.

К сожалению, я не пытался touch добавить новый файл, чтобы попытаться воспроизвести ошибку в командной строке; Я также удалил несколько сотен файлов, а не несколько.

Однако мой вопрос:

  • Существуют ли жесткие ограничения на размер файлов или количество файлов в каталоге?
  • Я даже на правильном пути здесь?

Nota Bene: SD-карта как есть - то есть я ее не отформатировал, поэтому я бы предположил, что это будет формат FAT- *.

Формат FAT-32 имеет жесткие ограничения на размер файлов размером 2 ГБ (значительно выше файлов, с которыми я имею дело) и ограничение количества файлов в корневом каталоге. Я определенно не пишу файлы в корневом каталоге.

Ответ 1

В корневом каталоге файловой системы FAT существует ограничение на 512 записей. Этот предел возникает из-за того, что корневой каталог живет в определенном месте в файловых системах FAT.

Для других каталогов этот предел отсутствует. Кроме того, FAT32 удалил ограничение 512 для корневой файловой системы, обратив корневой каталог так же, как и любой другой каталог.

Использование длинных имен файлов, т.е. не в формате 8.3, означает один файл использует несколько записей в каталоге.

Некоторые Google считает, что некоторые пользователи утверждают, что каталог FAT32 может содержать максимум 65 536 записей (что будет меньше файлов, если у них длинный файл имена). Тем не менее, ни один из источников, упомянувших этот предел, не казался надежным, поэтому я решил проверить это.

Я написал script, который создает файлы с 30 символами имен файлов, что означает, что для каждого файла потребуется 4 записи в каталоге. Когда script попал в файл 16,384, он потерпел неудачу с ошибкой ввода-вывода, и я не смог создать больше файлов в моей тестовой версии. Таким образом, это, похоже, подтверждает допустимый предел в 65 536.

Если вы нажмете это ограничение на 9 000 файлов, то ваши файлы должны использовать по крайней мере 7 записей, каждый из которых соответствует именам файлов длиной не менее 66 символов. Соответствует ли это тому, что вы делаете? (Или у вас могут быть короткие имена файлов и некоторые очень, очень длинные, но вы получите эту идею.)

Ответ 3

Я провел еще некоторое тестирование (надежное тестирование:-)), пытаясь написать 100 000 коротко названных каталогов в одном каталоге. Предел был достигнут на уровне 65 536.

Тест был выполнен на Nexus One под управлением Android 2.2, но я считаю, что результат сохраняется для любой карты FAT32 SD.