现在的位置: 首页 > 综合 > 正文

在Linux下创建大文件

2013年01月30日 ⁄ 综合 ⁄ 共 1318字 ⁄ 字号 评论关闭

在Linux c程序中创建一个2G的文件,循环写1KB的数据,共2*1024*1024次,最后一次写失败,

n=write(fd,buf,1024),n总是等于1023<1024,文件大小显示为2147483647B;

然后我又测试了往一个1G的文件中再追加1G的数据,循环写1KB的数据,共1024*1024次,也是最后一次写失败,问题同上。

write error ,write size is 1023(到2GB的最后一次写文件时,写不了1024个字节,只能写1023个字节)

后来百度了下,可能是Linux文件系统对文件大小的限制,尤其是看到了“Linux下2G文件限制解决方案”的东西后,我也不管三七二十一,就

下载netkit-ftp-0.18-pre1.tar.gz,解压缩后,修改ftp/ftp.c,ftp/main.c    加入

    #define _LARGEFILE_SOURCE //for LFS support

    #define _FILE_OFFSET_BITS 64 //for LFS support

    然后./configure && make 下,用ftp/ftp文件覆盖系统自带的ftp客户端,结果发现根本和我遇到的问题无关。

再检查我的文件系统是ext3,文件大小上限可达16G,按理可以成功创建2G的文件的。后来终于看到网上某个人发了“在LINUX平台下我有一个大于4G的文件, 怎么读这些文件的内容, ”的帖子,点进去看,才明白Linux下有如何处理大文件的方式。

linux支持大文件的两种方式:

1、gcc 加 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE

2、

#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64

建议两种方式都加上。

gcc creat_file.c -o creat_file然后./creat_file data1得到:

---------- 1 root root 2147483647 2012-02-09 16:17 data1(错误的)

在编译时加上gcc -D_FILE_OFFSET_BITS=64-D_LARG_FILE creat_file.c -o creat_file然后./creat_file data1得到::

---------- 1 root root 2147483648 2012-02-09 16:19 data1 (正确的)

同理,往1G的文件中添加1G的数据也正确运行:

---------- 1 root root 1073741824 2012-02-09 16:57 data2(1G的文件,追加前)

 gcc -D_FILE_OFFSET_BITS=64 -D_LARG_FILE rdwrfile.c -o rdwrfile然后./rdwrfile data2(执行追加的程序后)得到:

---------- 1 root root 2147483648 2012-02-09 16:59 data2(2G的文件,追加后)

在我的程序中只加了第一种方式,就可正确运行,得到正确的结果。只用第二种方式,不能解决问题。两种方式都加上,可以得到正确结果。

抱歉!评论已关闭.