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 )
}