SD卡上的目录中的文件数是否有限制?

问题描述:

我有一个为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文件大小(远高于我正在处理的文件大小)以及根目录中文件数量的限制有严格限制。我绝对不是在根目录下写文件。

有在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

我认为在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

我已经做了一些更多的测试(可靠的测试:-)),试图写入100,000个短命名目录一个目录。限额达到65,536。

该测试是在运行Android 2.2的Nexus One上完成的,但我相信任何FAT32 SD卡的结果都适用。

+0

太棒了!谢谢!这与@Dave Webb的答案是一致的,但对设备进行了初步研究。做得好! – jamesh 2010-08-02 22:25:14