2010-04-16 8 views
10

Ich habe ein Projekt für Android-Geräte geschrieben. Es erzeugt jeden Tag eine große Anzahl von Dateien. Dies sind alles Textdateien und Bilder. Die App verwendet eine Datenbank, um auf diese Dateien zu verweisen.Gibt es eine Begrenzung für die Anzahl der Dateien in einem Verzeichnis auf einer SD-Karte?

Die App soll diese Dateien nach ein wenig Gebrauch (vielleicht nach ein paar Tagen) aufräumen, aber dieser Prozess kann oder kann nicht funktionieren. Dies ist nicht Gegenstand dieser Frage.

Aufgrund eines historischen Unfalls ist die Organisation der Dateien etwas naiv: Alles befindet sich im selben Verzeichnis; ein .hidden Verzeichnis, das eine Null-Byte .nomedia Datei enthält, um zu verhindern, dass der MediaScanner sie indiziert.

Heute sehe ich ein Fehler gemeldet:

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

In Bezug auf die SD-Karte, ich sehe es viel Stauraum verlassen hat, aber

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

Löschen einer Anzahl von Dateien zu haben, zu zählen scheint erlaubte die Erstellung der Datei für heute um fortzufahren.

Bedauerlicherweise versuchte ich nicht touch eine neue Datei zu versuchen, um den Fehler auf einer Befehlszeile zu reproduzieren; Ich habe auch mehrere hundert Dateien gelöscht anstatt nur eine Handvoll.

aber meine Frage ist:

  • gibt es harte Grenzen für Dateigröße oder die Anzahl der Dateien in einem Verzeichnis?
  • bin ich hier sogar auf dem richtigen Weg?

Nota Bene: Die SD-Karte ist wie sie ist - das heißt ich habe es nicht formatiert, so würde ich denke, es wäre ein FAT- * Format sein.

Das FAT-32-Format hat harte Grenzen der Dateigröße von 2 GB (deutlich über den Dateigrößen, mit denen ich es zu tun habe) und eine Begrenzung der Anzahl der Dateien im Stammverzeichnis. Ich schreibe definitiv keine Dateien im Stammverzeichnis.

Antwort

20

Dort auf 512 Einträge in dem Stammverzeichnis des FAT-Dateisystem eine Grenze ist. Dieses Limit kommt zustande, weil das Root-Verzeichnis an einem bestimmten Ort auf FAT-Dateisystemen lebt.

Für andere Verzeichnisse ist dieses Limit nicht vorhanden. Darüber hinaus hat FAT32 das 512-Eintragslimit für das Stamm-Dateisystem entfernt, indem das Stammverzeichnis wie jedes andere Verzeichnis behandelte.

Verwenden langer Dateinamen - d. H. Nicht im Format 8.3 - bedeutet als a single file uses multiple directory entries.

Einige Googling finds some people claiming that a FAT32 directory can have a maximum of 65,536 entries (das wäre weniger Dateien, wenn sie lange Dateinamen hätten). Allerdings schien keine der Quellen, die diese Grenze erwähnten, so zuverlässig zu sein, dass ich dachte, ich würde das testen.

Ich schrieb ein Skript, das Dateien mit 30 Zeichen Dateinamen erstellt, was bedeutet, dass jede Datei 4 Verzeichniseinträge benötigt.Als das Skript zu 16.384 kam, scheiterte es mit einem IO Fehler und ich konnte keine weiteren Dateien in meinem Testdirektcode erstellen. Dies scheint die 65.536 Einstiegsgrenze zu bestätigen.

Wenn Sie dieses Limit bei 9.000 Dateien erreichen, müssen Ihre Dateien mindestens 7 Einträge enthalten, die jeweils mindestens 66 Zeichen lang sind. Passt das zu dem was du machst? (Oder Sie könnten einige kurze Dateinamen haben und einige sehr, sehr lange, aber Sie bekommen die Idee.)

+0

Große Antwort, einschließlich der Primärforschung. Das klingt sehr machbar. Der Bug ist v. Kürzlich wieder aufgetreten, wird also diese Theorie testen und zurückmelden. – jamesh

+1

Absolut scharf auf das Geld. 6k Dateien mit ca. 108 Zeichen im Dateinamen. 3.5k Dateien von ca. 9 Zeichen im Dateinamen. Vielen Dank. – jamesh

+0

Großartig, vielen Dank! – yava

5

ich denke, die Grenze von Dateien in einem Verzeichnis in Fat32 hängt auch von der Länge der Dateinamen

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

+0

In der Tat sagt die FAT32-Spezifikation, dass: "Die maximale gültige Verzeichnisgröße ist 2^21 Bytes." Das Verzeichnis ist eine spezielle Datei mit 32-Byte-Verzeichniseinträgen, die jeweils einen einzelnen 8.3-Dateinamen enthalten. Das bedeutet die Beschränkung auf 65.536 Kurznamen-Dateien, während lange Dateinamen mehrere Verzeichniseinträge belegen, wodurch das Limit effektiv verringert wird. Ich glaube, dass die Spezifikation die primäre Informationsquelle sein sollte und nicht Ad-hoc-Experimente zu einer konkreten, einzigen Einstellung. Die akzeptierte Antwort ist immer noch wertvoll, obwohl sie eigentlich nichts allgemeines beweist. –

3

Ich habe ein paar mehr Tests (zuverlässige Tests :-)), versucht, 100.000 Kurznamen Verzeichnisse zu schreiben ein einzelnes Verzeichnis. Die Grenze wurde bei 65.536 erreicht.

Der Test wurde auf Nexus One mit Android 2.2 durchgeführt, aber ich glaube, das Ergebnis gilt für jede FAT32 SD-Karte.

+0

Großartig! Vielen Dank! Dies stimmt mit der Antwort von @Dave Webb überein, aber mit der primären Forschung an einem Gerät. Gut gemacht! – jamesh

Verwandte Themen