扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
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 );
}
方法一:利用纯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_t st_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 函数
你需要使用fseek函数将文件指针指向最后:
fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
其中sz就是文件的大小。
当你知道文件的大小后,就可以通过fseek重新定义到文件开始的位置:
fseek(fp, 0L, SEEK_SET);
或使用下面的函数定义的文件开始:
rewind(fp);
可以到秒秒学上看看相关的内容,上面的课程讲解得可以的。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流