2010-04-16 30 views
10

J'ai un projet écrit pour les appareils Android. Il génère un grand nombre de fichiers, chaque jour. Ce sont tous des fichiers texte et des images. L'application utilise une base de données pour référencer ces fichiers.Y at-il une limite pour le nombre de fichiers dans un répertoire sur une carte SD?

L'application est censée effacer ces fichiers après une petite utilisation (peut-être après quelques jours), mais ce processus peut ou ne peut pas fonctionner. Ce n'est pas le sujet de cette question.

En raison d'un accident historique, l'organisation des fichiers est quelque peu naïve: tout est dans le même répertoire; un répertoire .hidden qui contient un fichier zéro octet .nomedia pour empêcher l'indexation de MediaScanner.

Aujourd'hui, je vois une erreur signalée:

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

En ce qui concerne la sdcard, je vois qu'il a beaucoup de stockage à gauche, mais le comptage

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

Suppression d'un certain nombre de fichiers semble avoir autorisé la création de fichier pour aujourd'hui à procéder.

Malheureusement, je n'ai pas essayé touch ing un nouveau fichier pour essayer de reproduire l'erreur sur une ligne de commande; J'ai également supprimé plusieurs centaines de fichiers plutôt qu'une poignée.

Cependant, ma question est:

  • y at-il des limites strictes sur la taille du fichier ou le nombre de fichiers dans un répertoire?
  • suis-je même sur la bonne voie ici?

Nota Bene: La carte SD est en l'état - à savoir que je ne l'ai pas formaté, donc je suppose que ce serait un GRAISSE * format. Le format FAT-32 a des limites strictes de taille de fichier de 2 Go (bien au-dessus des filesizes que j'ai affaire) et une limite de nombre de fichiers dans le répertoire racine. Je n'écris définitivement pas de fichiers dans le répertoire racine.

Répondre

20

Il y a une limite de 512 entrées dans le répertoire racine du système de fichiers FAT. Cette limite vient parce que le répertoire racine vit dans un endroit particulier sur les systèmes de fichiers FAT.

Pour les autres répertoires, cette limite n'est pas définie. En outre, FAT32 a supprimé la limite d'entrée 512 pour le système de fichiers racine en traitant le répertoire racine de la même manière que tout autre répertoire.

L'utilisation de noms de fichiers longs, c'est-à-dire pas au format 8.3, signifie a single file uses multiple directory entries.

Certains Googling finds some people claiming that a FAT32 directory can have a maximum of 65,536 entries (ce qui serait moins de fichiers s'ils avaient des noms de fichiers longs). Cependant, aucune des sources qui ont mentionné cette limite ne semblait fiable, alors j'ai pensé que je testerais cela.

J'ai écrit un script qui crée des fichiers avec des noms de fichiers de 30 caractères, ce qui signifie que chaque fichier aurait besoin de 4 entrées de répertoire.Lorsque le script est arrivé au fichier 16 384, il a échoué avec une erreur d'E/S et je n'ai pas pu créer plus de fichiers dans mon test direct. Cela semble donc valider la limite d'entrée de 65 536.

Si vous atteignez cette limite à 9 000 fichiers, vos fichiers doivent utiliser chacun au moins 7 entrées correspondant à des noms de fichier d'au moins 66 caractères. Est-ce que cela correspond à ce que vous faites? (Ou vous pourriez avoir quelques noms de fichiers courts et certains, très, très longs, mais vous avez l'idée.)

+0

Grande réponse, y compris la recherche primaire. Cela semble très faisable. Le bug a récemment eu lieu, il va donc tester cette théorie, et rendre compte. – jamesh

+1

Absolument bang sur l'argent. 6k fichiers d'environ 108 caractères dans le nom de fichier. 3.5k fichiers d'environ 9 caractères dans le nom de fichier. Merci. – jamesh

+0

Super, merci beaucoup! – yava

5

Je pense que la limite des fichiers dans un répertoire Fat32 dépend aussi de la longueur des noms de fichiers

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

+0

En effet, la spécification FAT32 dit que: "La taille maximale du répertoire valide est de 2^21 octets." Directory est un fichier spécial d'entrées de répertoire de 32 octets, chacune contenant un seul nom de fichier 8.3. Cela implique la limite de 65 536 fichiers de noms abrégés, tandis que les noms de fichier longs occupent plusieurs entrées de répertoire, réduisant ainsi la limite. Je crois que la spécification devrait être la principale source d'information plutôt que des expériences ad hoc sur un seul paramètre concret. La réponse acceptée est toujours valable, même si elle ne prouve rien de général. –

3

J'ai fait plus de tests (tests fiables :-)), en essayant d'écrire 100 000 répertoires avec des noms courts dans un seul répertoire. La limite a été atteinte à 65 536.

Le test a été fait sur Nexus One sous Android 2.2, mais je crois que le résultat est valable pour toute carte SD FAT32.

+0

Super! Merci! Ceci est en accord avec la réponse de @Dave Webb, mais avec des recherches primaires sur un appareil. Bon travail! – jamesh