最近做一个项目,需要获取文件大小,而文件大小又是超过 2GB 的。这就导致很多 c 标准函数不能正常工作。
linux c语言获取文件大小常用方法
常用方法有两类:利用 seek 系函数。
以 lseek 函数为例,它可以将定位要读写文件的位置,正常情况下,它会返回当前读写指针位置。让其指向文件末尾,即可获得文件大小。
利用 stat 系函数。
推荐用这个函数,比较简单,是专用来获取文件信息的函数。
seek 系函数获取文件大小
直接上代码:
stat 系函数获取文件大小
为何seek函数stat函数不能获取大于2GB的超大文件大小
以上介绍的两个例子在获取小于 2GB 的文件大小时,可以很好的工作,但是当文件大小大于 2GB 时,就不正常了。
其实,这主要是数据类型的长度限制的。lseek 的函数原型如下:
struct stat 的原型如下:
会发现,咱们要返回的值类型都是 off_t 的。
执行以下代码:
输出如果是 4,就很好理解为何以上函数只能获取小于 2GB 的文件大小了。
linux C语言获取大于2GB的超大文件大小
在/usr/include中执行shell命令:
查找 off_t类型的定义可以看出,off_t其实拥有两种类型:__off_t和__off64_t
要使 off_t为__off64_t类型,必须
还找到了这个:
所以,我们在包含所有头文件之前,需要:
这样就可以64位偏移地址形式操作文件。
咱们以 stat 函数为例,使用其 64 位类型的函数,代码如下:
应该很容易看懂,这样,咱们就完成了 linux 下C语言获取大于2GB的超大文件大小的代码了。