如何用C语言获取文件的大小

Python012

如何用C语言获取文件的大小,第1张

方法一:利用纯C语言来获取文件大小

unsigned long get_file_size(const char *filename){

unsigned long size

FILE* fp = fopen( filename, "rb" )

if(fp==NULL){

printf("ERROR: Open file %s failed.\n", filename)

return 0

}

fseek( fp, 0L, SEEK_END )

size=ftell(fp)

fclose(fp)

return size

}

注:

ftell函数返回文件指针当前位置相对应文件首的便宜字节数,参数为文件指针。

fseek函数用于移动文件指针,第一个参数是文件指针,第二个参数是偏移量(正数表示正向偏移,负数表示负向偏移),第三个参数设定文件从哪里偏移,有三个选择:SEEK_SET(文件头,其是常数0)、SEEK_CUR(文件当前位置,其是常数1)、SEEK_END(文件尾,其是常数2)。

优缺点:好处是你只要会C语言,就能够完全掌握而且十分容易理解这里面的道理。确定是纯C语言目前只能读取不超过2G的文件。所以对于超过2G的文件,其返回值是不正确的。

方法二:利用系统函数获取

笔者使用Uinx/Linux,所以此处就只写这类平台上的文件大小获许方式了。在Linux类平台上,每个被系统所管理的文件都有一个文件属性结构体(其中一个属性就是文件大小)与其对应,这个结构体叫stat,其内容在 /sys/stat.h中:

stat {

mode_t st_mode //文件对应的模式,文件,目录等

ino_t st_ino //inode节点号

dev_t st_dev //设备号码

dev_t st_rdev //特殊设备号码

nlink_tst_nlink //文件的连接数

uid_t st_uid //文件所有者

gid_t st_gid //文件所有者对应的组

off_t st_size //普通文件,对应的文件字节数

time_t st_atime //文件最后被访问的时间

time_t st_mtime //文件内容最后被修改的时间

time_t st_ctime //文件状态改变时间

blksize_t st_blksize //文件内容对应的块大小

blkcnt_t st_blocks//伟建内容对应的块数量

}

文件的上述属性,可以通过一个stat函数来获取。

stat函数声明形式:

stat(const char *restrict path, struct stat *restrict buf)

第一个参数是文件名,第二个参数是指向一个stat结构的指针。

由此我们很容易写出如下函数:

unsigned long get_file_size(const char *filename){

struct stat buf

if(stat(filename, &buf)<0){

return 0

}

return (unsigned long)buf.st_size

}

在进行大文件处理时,显然需要采取后者。

注:与stat函数类似的函数还有lstat函数、fstat 函数

以上几个方法执行的效果都如下:

读取的text文件如下:

空洞文件即是里面内容都是空字符的文件,主要用来占位置,实现如下:

生成的文件如下:

用vim打开是这样的

c语言可以通过stat()函数获得文件属性,通过返回的文件属性,从中获取文件大小。

#include

<sys/stat.h>

可见以下结构体和函数

struct

stat

{

_dev_t

st_dev

_ino_t

st_ino

unsigned

short

st_mode

short

st_nlink

short

st_uid

short

st_gid

_dev_t

st_rdev

_off_t

st_size

//文件大小

time_t

st_atime

time_t

st_mtime

time_t

st_ctime

}

stat(const

char

*,

struct

_stat

*)

//根据文件名得到文件属性

参考代码:

#include <sys/stat.h>

void main( )

{

struct stat buf

if ( stat( "test.txt", &buf ) <0 )

{

perror( "stat" )

return

}

printf("file size:%d\n", buf.st_size )

}