获取文件大小(C语言)

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

unsigned long get_file_size(constchar *filename){
    unsigned long size;
    FILE* fp = fopen( filename,"rb" );
    if(fp==NULL){
        printf("ERROR: Openfile %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(constchar *restrict path,struct stat *restrict buf);

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

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

unsigned long get_file_size(constchar *filename){
 struct stat buf;

 if(stat(filename,&buf)<0){
 return 0;
 }

 return (unsignedlong)buf.st_size;
}

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

注:与stat函数类似的函数还有lstat函数、fstat 函数,具体用法请man。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值