支持大文件的两种方式:

1、gcc 加 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE

2、注意一定要定义在include之前

#define _LARGEFILE_SOURCE

#define _LARGEFILE64_SOURCE

#define _FILE_OFFSET_BITS 64

建议两种方式都加上。

如何create大文件

要大就非常大,1T吧。

有两种方法:

一.dd

dd if=/dev/zero of=1T.img bs=1G seek=1024 count=0

bs=1G表示每一次读写1G数据,count=0表示读写0次,seek=1024表示略过1024个Block不写,前面block size是1G,所以共略过1T!

这是创建大型sparse文件最简单的方法。

二.ftruncate64/ftruncate

如果用系统函数就稍微有些麻烦,因为涉及到宏的问题。我会结合一个实际例子详细说明,其中OPTION标志的就是测试项。

文件sparse.c:

//OPTION 1:是否定义与大文件相关的宏

#define _LARGEFILE_SOURCE

#define _LARGEFILE64_SOURCE

#define _FILE_OFFSET_BITS 64

#include

#include

#include

#include

#include

#include

#define FILENAME "bigfile"

#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)

int main(int argc, char **argv)

{

int fd, ret;

off_t offset;

int total = 0;

if ( argc >= 2 )

{

total = atol(argv[1]);

printf("total=%d\n", total);

}

//OPTION 2:是否有O_LARGEFILE选项

//fd = open(FILENAME, O_RDWR|O_CREAT|O_LARGEFILE, 0644);

fd = open(FILENAME, O_RDWR|O_CREAT, 0644);

if (fd < 0) {

perror(FILENAME);

return -1;

}

offset = (off_t)total *1024ll*1024ll*1024ll;

printf("offset=%ld\n", offset);

//OPTION 3:是否调用64位系统函数

//if (ftruncate64(fd, offset) < 0)

if (ftruncate(fd, offset) < 0)

{

printf("[%d]-ftruncate64 error: %s\n", errno, strerror(errno));

close(fd);

return 0;

}

close(fd);

printf("OK\n");

return 0;

}

测试环境:

linux:/disk/test/big # gcc --version

gcc (GCC) 3.3.5 20050117 (prerelease) (SUSE Linux)

linux:/disk/test/big # uname -a

Linux linux 2.6.11.4-20a-default #1 Wed Mar 23 21:52:37 UTC 2005 i686 i686 i386 GNU/Linux

测试结果(伪码表示):

1.宏定义完全的情况下:

IF {O_LARGEFILE=TRUE && ftruncate64=TRUE}

OK;

ELSEIF {O_LARGEFILE=FALSE && ftruncate64=TRUE}

OK;

ELSEIF {O_LARGEFILE=FALSE && ftruncate64=FALSE}

运行不报错,但是不支持>4G;

ELSEIF {O_LARGEFILE=TRUE && ftruncate64=FALSE}

运行不报错,但是不支持>4G;

【结论】:在宏定义完全的情况下,是否调用ftruncate64,是决定支持4G以上文件的关键,O_LARGEFILE无作用。

2.宏定义不完全:缺少_FILE_OFFSET_BITS

首先声明一点,O_LARGEFILE需要定义_LARGEFILE64_SOURCE。

IF {O_LARGEFILE=TRUE && ftruncate64=TRUE}

产生不正常超大文件;

ELSEIF {O_LARGEFILE=FALSE && ftruncate64=TRUE}

产生不正常超大文件;

ELSEIF {O_LARGEFILE=FALSE && ftruncate64=FALSE}

运行不报错,但是不支持>2G;

ELSEIF {O_LARGEFILE=TRUE && ftruncate64=FALSE}

运行不报错,但是不支持>4G;

【结论】:未定义_FILE_OFFSET_BITS的情况下,ftruncate64调用是非法的,会产生无法预料的后果,这里的测试就是产生一个超大文件(>1T),我也无法解释其原因;O_LARGEFILE的作用就是在32位系统中支持大文件系统,允许打开那些用31位(2G)都不能表示其长度的大文件;此外,off_t为 unsigned int类型,也就是说最多只能达到4G,所以ftruncate最大支持4G文件。

总结一下:如果要支持超过2G的文件,至少需要定义 _LARGEFILE64_SOURCE宏,并且设置O_LARGEFILE选项;如果要支持超过4G,需要定义所有上述的宏,并且调用 ftruncate64;其余的搭配都是错误的!

【附】:

dd 的主要选项:

指定数字的地方若以下列字符结尾乘以相应的数字:

b=512, c=1, k=1024, w=2, m=1024k, g=1024m

大小写不限。

if=file

输入文件名,缺省为标准输入。

of=file

输出文件名,缺省为标准输出。

ibs=bytes

一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。

obs=bytes

一次写 bytes 个字节(即一个块大小为 bytes 个字节)。

bs=bytes

同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。

cbs=bytes

一次转换 bytes 个字节,即转换缓冲区大小。

skip=blocks

从输入文件开头跳过 blocks 个块后再开始复制。

seek=blocks

从输出文件开头跳过 blocks 个

linux生成4g文件,linux中创建超过4g文件的方法-o_largefile?相关推荐

  1. java中写入文件_java中创建、写入文件的5种方式

    在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法. Files.newBufferedWriter(Java 8) Files. ...

  2. java在linux创建文件_Java中创建并写文件的5种方式

    导读 在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法. 在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下 ...

  3. python怎么创建文件夹_如何使用python在文件夹中创建文本文件?

    我试图在一个不是运行脚本的目录的文件夹中创建一个.txt文件.我有一个脚本所在的文件夹,我可以在脚本所在的同一个目录中创建该文件夹,但它不会在该文件夹中创建文本文件.我通常遇到两个错误中的一个:Per ...

  4. linux如何生成tar文件内容,在Linux系统中创建tar.gz文件的方法及实例讲解

    本文介绍在Linux系统中创建tar.gz文件的方法,及实例讲解. 介绍 tar存档是一个文件,用于存储其他文件的集合,包括有关它们的信息,例如所有权.权限和时间戳. 在Linux操作系统中,可以使用 ...

  5. linux 获取文件父目录权限,Linux 文件权限中,操作一个文件需要父目录的那些权限?...

    eudore:linux 文件权限中,操作一个文件需要父目录的那些权限? 是否需要检查每级目录?想找到一份完整规范正确的指导,自己在写检查 linux 用户文件权限的代码. 例如读取一个文件 /hom ...

  6. Linux 命令行访问名字中包含空格的文件或文件夹

    Linux 命令行访问名字中包含空格的文件或文件夹 在 Windows 下命名文件或文件夹名有空格是可以的,甚至在 Windows 和 Ubuntu 虚拟机共享的文件中也可以这么做,但是在 Ubunt ...

  7. linux 查看硬盘的uuid_Ubuntu中查看硬盘分区UUID的方法(所有Linux目录的解释)

    在Ubuntu中UUID的两种获取方法,至于UUID是什么,你可以大概理解为分区的标识符,像条形码那样. 在终端中输入下面的命令就可心查看到分区UUID了. 命令1. sudo blkid 命令2. ...

  8. 如何在文件夹中创建nodeJs项目

    打开所在要创建的项目文件夹 首先在你的电脑上必须要装有node.js,否则一切都是空谈. 在项目文件夹中创建package.json npm init 有了package.json文件,直接使用npm ...

  9. [OpenCV] 练习题实现代码 使用 cv.addWeighted 函数在文件夹中创建图像的幻灯片放映,并在图像之间进行平滑过渡

    1.问题背景 opencv 官方手册 文档 练习题 练习题实现代码 使用 cv.addWeighted 函数在文件夹中创建图像的幻灯片放映,并在图像之间进行平滑过渡 2.代码部分 按任意键切换幻灯片 ...

  10. VirtualBox问题——无法在父文件夹中创建虚拟文件夹

    创建新系统提示无法在父文件夹中创建虚拟文件夹 解决:以管理员的身份运行VirtualBox

最新文章

  1. 2022-2028年中国企业核心路由交换机行业市场前瞻与投资分析报告
  2. collect的功能是什么?其底层如何实现的?_用Python实现定时自动化收取蚂蚁森林能量,再也不怕被偷了
  3. Mysql数据库常用命令,mysql速学实用教程。
  4. windows c语言目录操作函数,c语言目录操作在C/C++语言中如何进行目录操作,如得到目录内的 爱问知识人...
  5. P NP NPC NP hard
  6. 2018-2019-20175203 实验二 《Java面向对象程序设计》
  7. 《JavaScript高级程序设计》阅读笔记(十五):浏览器中的JavaScript
  8. oracle删除数据用户,oracle删除用户及表空间,导入用户和数据
  9. c语言吧五子棋纯干货注释,请帮我注释下这个五子棋程序
  10. HDFS的命令行使用【常用 hdfs 命令】
  11. 华硕Chromebox-cn 62+i7-5500 U+HD 5500
  12. 【2023】上海交通大学计算机考研信息汇总
  13. Fantastic-Matplotlib 第一回
  14. 细说 Java 中的浅克隆与深克隆
  15. 苹果手机上滑动会卡顿_苹果手机Safari浏览器下滑动卡顿的问题
  16. 数字视频压缩的可行性
  17. [Python图像处理] 二十九.MoviePy视频编辑库实现抖音短视频剪切合并操作
  18. 李宏毅老师官方授权!《李宏毅机器学习特训营》发布,放心免费学!
  19. 传感器与检测技术基础知识(5)—— 电容式传感器
  20. 人脸识别显示内部服务器显示错误,百度人脸识别——人脸搜索,出现222207错误(未找到匹配用户)怎么解决...

热门文章

  1. 华为网络拒绝接入_为何华为手机网络拒绝接入
  2. mac上的android模拟器下载安装,Mac电脑上安装安卓模拟器,Mac如何安装Android模拟器...
  3. PRD之道:活用Axure快速撰写轻便的需求文档
  4. [QCTF2018]X-man-Keyword
  5. 靶机-droopyCTF Walkthrough
  6. 用简单的Python HTTP server来共享文件
  7. CDR是什么软件?用来做什么的,CorelDRAW版本更新历史及快捷键教程分享下载
  8. Buckhorn跳羚声卡驱动安装设置方法
  9. puppeteer实现网页截图
  10. 2021世界量子计算机排名,2021 QS世界大学学科排名如期出炉啦!