我有一个为Android设备编写的项目。它每天都会生成大量文件。这些都是文本文件和图像。该应用程序使用数据库来引用这些文件。
应用程序应该在一点点使用后(可能在几天之后)清理这些文件,但这个过程可能会也可能不会起作用。这不是这个问题的主题。
由于历史性事故,文件的组织有点幼稚:一切都在同一个目录中;一个.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(远高于我正在处理的文件大小)和根目录中文件数量的限制。我绝对不会在根目录中写文件。
答案 0 :(得分:21)
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错误,我无法在我的测试指南中创建更多文件。所以这似乎证实了65,536的进入限制。
如果您在9,000个文件中达到此限制,那么您的文件必须至少使用7个条目,每个条目对应于至少66个字符长的文件名。这与你正在做的事情相符吗? (或者你可以有一些简短的文件名和一些非常非常长的文件名,但你明白了。)
答案 1 :(得分:5)
我认为Fat32目录中文件的限制也取决于文件名的长度
http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx
答案 2 :(得分:4)
我做了一些测试(可靠测试:-)),尝试在一个目录中编写100,000个短命名目录。限制达到65,536。
测试是在运行Android 2.2的Nexus One上完成的,但我相信结果适用于任何FAT32 SD卡。
答案 3 :(得分:-1)
实际限制远低于512,
取决于您所连接的Android设备:
当我将手机(Samsung A5 2015)连接到计算机(Ubuntu)时:
通过计算机,我可以轻松地在手机上读取/写入文件,
除了包含300个文件的目录之外。
对于任何简单的操作,它的速度是无限慢的:
列出内容,复制文件,删除文件。 。 。
因此,我认为手机的文件数量受到实际限制。
我也有没有这个问题的平板电脑。