2010-04-16 23 views
10

Tengo un proyecto escrito para dispositivos Android. Genera una gran cantidad de archivos, cada día. Estos son todos los archivos de texto e imágenes. La aplicación usa una base de datos para hacer referencia a estos archivos.¿Existe un límite para la cantidad de archivos en un directorio en una tarjeta SD?

Se supone que la aplicación debe borrar estos archivos después de un pequeño uso (quizás después de unos días), pero este proceso puede o no estar funcionando. Este no es el tema de esta pregunta.

Debido a un accidente histórico, la organización de los archivos es algo ingenua: todo está en el mismo directorio; un directorio .hidden que contiene un archivo .nomedia de cero bytes para evitar que el MediaScanner lo indexe.

Hoy en día, estoy viendo informa de un error:

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

En cuanto a la sdcard, veo que tiene gran capacidad de almacenamiento a la izquierda, pero contando

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

Eliminación de un número de archivos parece tener permitido la creación de archivos para hoy.

Lamentablemente, no probé touch ing un nuevo archivo para tratar de reproducir el error en una línea de comandos; También borré varios cientos de archivos en lugar de un puñado.

Sin embargo, mi pregunta es:

  • ¿existen límites estrictos tamaño del archivo o el número de archivos en un directorio?
  • ¿Estoy aún en el camino correcto aquí?

Nota Bene: La tarjeta SD es tal y como son - es decir, que no se lo he formateado, por lo que supongo que sería una FAT * formato.

El formato FAT-32 tiene límites duros de tamaño de archivo de 2 GB (muy por encima de los tamaños de archivo que estoy tratando) y un límite de número de archivos en el directorio raíz. Definitivamente no estoy escribiendo archivos en el directorio raíz.

Respuesta

20

hay un límite en 512 entradas en el directorio raíz del sistema de archivos FAT. Este límite se produce porque el directorio raíz vive en un lugar particular en los sistemas de archivos FAT.

Para otros directorios, este límite no está establecido. Además, FAT32 eliminó el límite de 512 entradas para el sistema de archivos raíz al tratar el directorio raíz como cualquier otro directorio.

El uso de nombres de archivo largos, es decir, no en formato 8.3, significa que a single file uses multiple directory entries.

Algunos Googling finds some people claiming that a FAT32 directory can have a maximum of 65,536 entries (que serían menos archivos si tuvieran nombres de archivo largos). Sin embargo, ninguna de las fuentes que mencionaron este límite parecía tan confiable, así que pensé en probar esto.

Escribí un script que crea archivos con 30 nombres de archivos de caracteres, lo que significa que cada archivo necesitaría 4 entradas de directorio.Cuando el script llegó al archivo 16,384 falló con un error de IO y no pude crear más archivos en mi directorio de prueba. Entonces esto parece validar el límite de entrada de 65,536.

Si está alcanzando este límite en 9,000 archivos, entonces sus archivos deben estar utilizando al menos 7 entradas cada una que corresponda a nombres de archivo que tengan al menos 66 caracteres de longitud. ¿Esto coincide con lo que estás haciendo? (O podría tener algunos nombres de archivos cortos y algunos muy, muy largos, pero se entiende).

+0

Gran respuesta, incluida la investigación primaria. Esto suena muy factible. El error ha cambiado recientemente, así que probará esta teoría e informará. – jamesh

+1

Absolutamente golpear el dinero. 6k archivos de aproximadamente 108 caracteres en el nombre del archivo. 3.5k archivos de aproximadamente 9 caracteres en el nombre del archivo. Gracias. – jamesh

+0

Genial, muchas gracias! – yava

5

creo que el límite de archivos en un directorio en Fat32 también depende de la longitud de los nombres de archivo

http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx

+0

De hecho, la especificación FAT32 dice que: "El tamaño máximo de directorio válido es 2^21 bytes". El directorio es un archivo especial de entradas de directorio de 32 bytes, cada una con un nombre de archivo de 8.3. Eso implica el límite de 65.536 archivos de nombres cortos, mientras que el nombre de archivo largo ocupa varias entradas de directorio, lo que reduce el límite de forma efectiva. Creo que la especificación debería ser la principal fuente de información en lugar de experimentos ad-hoc en una única configuración concreta. La respuesta aceptada sigue siendo valiosa, aunque en realidad no demuestre nada general. –

3

He hecho más pruebas (pruebas confiables :-)), tratando de escribir 100.000 directorios con nombres cortos en un solo directorio El límite se alcanzó en 65,536.

La prueba se realizó en Nexus One con Android 2.2, pero creo que el resultado es válido para cualquier tarjeta SD FAT32.

+0

¡Genial! ¡Gracias! Esto concuerda con la respuesta de @Dave Webb, pero con una investigación primaria en un dispositivo. ¡Buen trabajo! – jamesh

Cuestiones relacionadas