2010-04-16 201 views
10

我有一個爲Android設備編寫的項目。它每天都會生成大量文件。這些都是文本文件和圖像。該應用程序使用數據庫來引用這些文件。SD卡上的目錄中的文件數是否有限制?

應用程序應該稍微使用(也許幾天後)清除這些文件,但這個過程可能會或可能不會工作。這不是這個問題的主題。

由於歷史性事故,文件的組織有些天真:一切都在同一個目錄中;一個.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格式對2GB文件大小(遠高於我正在處理的文件大小)以及根目錄中文件數量的限制有嚴格限制。我絕對不是在根目錄下寫文件。

回答

20

有在FAT文件系統的根目錄512項限制的長度。這個限制是因爲根目錄位於FAT文件系統的特定位置。

對於其他目錄,此限制不適用。此外,通過將根目錄與任何其他目錄相同,FAT32刪除了根文件系統的512條目限制。

使用長文件名 - 即不是8.3格式 - 意味着不是a single file uses multiple directory entries

一些Googling finds some people claiming that a FAT32 directory can have a maximum of 65,536 entries(如果他們有長文件名將會減少文件)。然而,沒有提到這個限制的來源似乎是可靠的,所以我想我會測試這個。

我寫了一個腳本,用30個字符的文件名創建文件,這意味着每個文件需要4個目錄條目。當腳本到達文件16,384時,IO錯誤失敗,我無法在我的測試directoy中創建更多文件。所以這似乎證實了65,536的入口限制。

如果您在9,000個文件中達到此限制,那麼您的文件必須至少使用7個條目,每個條目對應至少66個字符長的文件名。這與你正在做的事情相符嗎? (或者你可以有一些簡短的文件名和一些非常長的文件名,但是你有這個想法。)

+0

很好的答案,包括初級研究。這聽起來非常可行。這個bug最近重新發生了,所以會測試這個理論,然後回報。 – jamesh 2010-04-20 23:22:40

+1

絕對轟炸錢。文件名中包含大約108個字符的6k個文件。文件名中約有9個字符的3.5k文件。謝謝。 – jamesh 2010-04-21 20:05:00

+0

太好了,非常感謝! – yava 2012-05-09 04:49:18

5

我認爲在FAT32的一個目錄中的文件的限制也依賴於文件名

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

+0

事實上,FAT32規範說:「最大有效目錄大小是2^21字節。」目錄是32字節目錄條目的特殊文件,每個文件包含一個8.3文件名。這意味着65536個短名稱文件的限制,而長文件名佔用多個目錄條目,從而有效地降低限制。 我認爲規範應該是信息的主要來源,而不是在具體的單一設置上進行專門的實驗。被接受的答案仍然是有價值的,即使它實際上不能證明任何一般性的東西。 – 2013-05-07 17:00:39

3

我已經做了一些更多的測試(可靠的測試:-)),試圖寫入100,000個短命名目錄一個目錄。限額達到65,536。

該測試是在運行Android 2.2的Nexus One上完成的,但我相信任何FAT32 SD卡的結果都適用。

+0

太棒了!謝謝!這與@Dave Webb的答案是一致的,但對設備進行了初步研究。做得好! – jamesh 2010-08-02 22:25:14