• 32位linux系统操作大于2G文件方法


    一、获取文件大小

    1、使用stat函数获取文件大小

    先看看struct结构吧,其中文件大小定义如下:

    #ifndef __USE_FILE_OFFSET64
        __off_t st_size;   /* Size of file, in bytes.  */
    #else
        __off64_t st_size;   /* Size of file, in bytes.  */
    #endif

    一般我们使用的都是__off_t,也就是long int(4个字节,-2147438648~+2141438647),而__off64_t则是long long int(8个字节,-9223372036854775808~+9223372036854775807)。

    我们尝试使用stat去读一个4.2G的文件,看读到的文件大小为多少。运行竟然报错,“Permission denied”,许可拒绝。

    看样直接读是不行的,我们在编译的时候加入-D_FILE_OFFSET_BITS=64选项,再次尝试,此次我们文件大小正常获取了。

    综上所述,如果要获取一个大于2G的文件的大小,则需要在编译的时候加入编译选项。

    2、使用awk脚本获取

    char buff[16];
    FILE *fp = popen("ls -l /mnt/hgfs/share/worspace/CIS7.5/src/test/big|awk '{print $5}'", "r");
    fgets(buff, sizeof(buff), fp);

    此方法需要awk脚本的支持,并不推荐使用。

    二、读写文件

    正常情况下大于2G的文件在读写的时候到了2G就会自动退出,报“文件大小超出限制”的错误。

    此时有两种办法来解决

    1、加入编译选项

    -D_FILE_OFFSET_BITS=64

    2、在open的第二个参数加入O_LARGEFILE位。

    以上两种方法都测试通过,读写大于4G的文件没有任何问题。

    对于要操作大文件,个人觉得最靠谱的就是加入编译宏,这个靠谱,其它跟以前一样照旧。

  • 相关阅读:
    Struts2标签库
    ognl表达式
    Struts2拦截器
    Struts2文件上传与下载
    Swoft2.x 小白学习笔记 (四) --- RPC
    Swoft2.x 小白学习笔记 (三) --- Task、协程
    Swoft2.x 小白学习笔记 (二) --- mysql、redis
    Swoft2.x 小白学习笔记 (一) ---控制器
    Tornado WebSocket简单聊天
    用python实现的21点游戏
  • 原文地址:https://www.cnblogs.com/osyun/p/2847304.html
Copyright © 2020-2023  润新知