android 文件系统,创建单个文件大小有2G限制

最近有碰到一个问题,在使用 Camera 录相的时候,录像文件大小达到 2G 时,就自动保存了。

起初以为是在代码中作了最大录像文件大小的限制。

        long maxFileSize = mStorageSpace - Storage.LOW_STORAGE_THRESHOLD;
        Log.e(TAG,"----------initializeRecorder-----------------requestedSizeLimit=" + requestedSizeLimit);
        if (requestedSizeLimit > 0 && requestedSizeLimit < maxFileSize) {
            maxFileSize = requestedSizeLimit;
        }
 
        try {
	    Log.v(TAG, "maxFileSize "+maxFileSize);
            mMediaRecorder.setMaxFileSize(maxFileSize);
        } catch (RuntimeException exception) {
            // We are going to ignore failure of setMaxFileSize here, as
            // a) The composer selected may simply not support it, or
            // b) The underlying media framework may not handle 64-bit range
            // on the size restriction.
        }

但通过在上述代码中加 log 来看,maxFileSize 为剩余磁盘空间大小(磁盘空间大小足够,远大于2G)。

后面通过网络查询才知道是 32位 linux 系统有创建单个文件 2G大小 上限限制(众所周知,android 是采用的 linux 内核)。

在 32 位的 Linux 上面写超过 2GB 的文件会发生错误,甚至导致程度终止执行,

这是因为 Linux 的系统内部处理档案时用的数据类型为 long,而 long 在32 位的系统上大小为 32 位,因此最大只能支持到2^31-1 = 2,147,483,647 bytes ,等于是 2GB 扣掉1byte 的文件大小。

详细内容参见:http://blog.urdada.net/2008/04/18/84/

关于Linux 各种文件系统的特征如下所示(来自于网络):

Ext2


Ext2 文件系统是Linux 特有的文件系统,它拥有传统UNIX 文件系统的许多特性,如块、inode
和目录等概念。Ext2 非常健壮,具有很多优良的性能。同时,Ext2 也是可扩展的,它提供
的扩展功能允许用户在不格式化文件系统的情况下使用新的特性。
----------------------------------------------------
最大文件大小: 1TB
最大文件极限: 仅受文件系统大小限制
最大分区/文件系统大小: 4TB
最大文件名长度: 255 字符
缺省最小/最大块大小: 1024/4096 字节
缺省inode 分配: 每4096 字节为1
在强制FS 检查前的最大装载: 20(可配置)
----------------------------------------------------


Ext3


Ext3 文件系统构筑于ext2 文件系统之上,对标准的Linux ext2 文件系统进行了日志扩展。
日志特性显著地减少文件系统崩溃后的恢复时间,它被广泛地应用于带有共享磁盘的HA 站
点。
----------------------------------------------------
最大文件大小: 1TB
最大文件极限: 仅受文件系统大小限制
最大分区/文件系统大小: 4TB
最大文件名长度: 255 字符
缺省最小/最大块大小: 1024/4096 字节
缺省inode 分配: 每4096 字节为1
在强制FS 检查前的最大装载: 20(可配置)
----------------------------------------------------
ReiserFS


ReiserFS 文件系统3.2.25 版是一种可选的日志文件系统。其优点包括更好的磁盘空间利用率、
更好的磁盘访问性能和更快的崩溃恢复功能。
----------------------------------------------------
最大文件大小: 1TB
最大文件极限: 32k 目录,42 亿文件
最大分区/文件系统大小: 4TB
最大文件名长度: 255 字符
----------------------------------------------------
JFS


日志文件系统(Journaled File System, JFS)是一种全64 位文件系统。所有文件系统结构字
段均为64 位大小。它允许JFS 同时支持大文件和分区。JFS 由IBM 根据GPL 许可开发,它
是从其AIX 系统移植过来的。
JFS 提供基于日志的字节级文件系统,它可以开发用于面向交易的高性能系统。它是可扩展
的,且稳定可靠,其优于非日志文件系统之处在于其快速重新启动能力。JFS 可以在数秒钟
或分钟之间将文件系统恢复到完好一致的状态。
尽管它主要针对服务器的高吞吐量和可靠性要求(从单一处理器系统到高级多处理器和集群
系统)而设计,JFS 同样也适用于要求性能和可靠性的客户配置。
----------------------------------------------------
最小文件系统大小 16 MB
最大文件大小: 受体系结构限制
最大文件极限: 受文件系统大小限制
缺省最小/最大块大小: 1024/4096 字节
缺省inode 分配: 动态
----------------------------------------------------


LVM


逻辑卷管理程序(Logical Volume Manager, LVM)是一种在线磁盘存储管理的子系统,它已
经成为跨Linux 存储管理的“事实上”标准。
LVM 支持磁盘和磁盘子系统的企业级卷管理,它可以成组任意数量的磁盘到卷组。卷组的
总能力可以分配给逻辑卷,这些逻辑卷可以按正常块设备来进行访问。
此外,LVM 还提供存储的逻辑分离。当在线地对块设备进行大小调整的过程中,可以将数
据从一个物理设备移动到另一个物理设备。LVM 也允许系统管理员轻松地对系统进行升级,
去除有故障的磁盘,重新组织负载,并适应变化了的系统需求。
----------------------------------------------------
最大逻辑卷大小 从使用4 Mb 盘区的256 Gb
到使用较大PE 的1 Pb
最大逻辑卷数: 256
最大逻辑组数: 99
每PV 的最大PE 数: 65534
缺省物理盘区大小: 4 Mb
----------------------------------------------------

可以用如下代码来测试你当前的文件系统支持的最大文件大小

void main()
{
	int fd;
	char s[]="Linux Programmer!\n";
	fd =open("/home/tgbao/temp",O_WRONLY|O_CREAT);
	while(1)
	{
		write(fd,s,sizeof(s));
	}
	close(fd);
} 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值