获取文件大小(C语言)

http://oucmsc.blog.163.com/blog/static/12634032820121078371420/


大四的时候,做毕业设计,在读写SEGY文件时需要获取所读文件的大小,但是当时并没有直接解决这个问题,而采用了手动标注炮数的方法。

这次再读取DICOM文件是再次遇到(后来发现可以不用这个功能)这个问题,本着不会再有让我解决这个问题的机会了,于是上网搜了搜……

方法一:利用纯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 函数,具体用法请man。

你可能感兴趣的:(获取文件大小(C语言))