C语言是一种比较底层的语言,有时在其他语言中很容易操作的事情,在C语言中就比较麻烦,例如获取一个文件的大小。Java中File类有个length函数,Python中os.path包中有个getsize函数,C语言中却没有直接对应的函数获取文件大小。

目前,网上有一种流传很广的方法,读取文件到内存,然后跳转到文件末尾,查看跳转的长度。代码如下:

int file_size(char* filename)
{
FILE *fp=fopen(filename,"r");
if(!fp) return -1;
fseek(fp,0L,SEEK_END);
int size=ftell(fp);
fclose(fp); return size;
}

上述方法利用fseek移动一个文件的存取位置到文件的末尾,然后利用ftell获得目前的文件访问位置。这种方法可以认为是一种间接的获取方式。虽说可以获得文件大小,但是有两个缺点。首先,ftell的返回值为long,在不同环境下占用的字节数也不同,这就可能存在long是四个字节的情况。此时,获取的文件大小就不能超过2G,否则就会出错。

但是,上述缺点在大多数情况下都没问题,超大文件还可以通过fsetpos和fgetpos获取文件大小。最致命的缺陷就是它需要加载文件到内存,然后跳转到文件末尾,这个操作非常耗时!可能在读取少量文件时体现不出,但是当文件达到上万个时,速度就会慢的要命,这种方法相当于把所有的文件都读到内存中一遍!

如果可能,尽量避免采用上述间接的方式获取文件大小。在linux下,还有一种更简单的方式,通过读取文件信息获得文件大小,速度也快很多。代码如下:

#include <sys/stat.h>
int file_size2(char* filename)
{
struct stat statbuf;
stat(filename,&statbuf);
int size=statbuf.st_size; return size;
}

这种方式首先获得相关文件的状态信息,然后从状态信息中读取大小信息。由于没有读取文件的操作,所以操作速度非常快。强烈建议大家在linux下使用这种方式。Windows平台下肯定也有类似的函数读取文件信息,不过本人常年不在windows下编程,所以在此不做介绍。

C语言获取文件大小的更多相关文章

  1. C语言获取文件大小相关操作

    C语言获取文件大小相关操作 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明 通常在希望从文件中把数据全都出来赋值给一个数组或者某一个指针,然后再进行相关 ...

  2. C/C++ 语言获取文件大小

    在C语言中测试文件的大小,主要使用二个标准函数. 1.fseek 函数原型:int fseek ( FILE * stream, long int offset, int origin ); 参数说明 ...

  3. C语言获取文件大小(字节)

    代码 核心代码 FILE *pfile = nullptr; int ret = fopen_s(&pfile, str.c_str(), "rb"); /// 0 = 打 ...

  4. 用C语言获取任意文件的长度(可能大于2GB)

    用C语言获取文件长度的常见思路是: 打开文件后用 fseek() 函数把文件位置指针移动到文件的末尾,用 ftell() 获得这时位置指针距文件头的字节数,这个字节数就是文件的长度.但是这样做也会受到 ...

  5. [MongoDB] 32Bit构建上文件大小限制问题

    一. 问题概述 今天看看爬虫抓取的数据,发现数据无法插入,首先想到的就是32Bit构建的文件大小限制问题,检查一下还真的是.本文把整个检查问题,解决问题的过程记录下来. 问题:     "s ...

  6. 压缩SWF文件大小!减少40%体积!

     使用FlashBuild作为IDE的痛苦是显著的!如果开发的项目比较大,那么卡顿.崩溃.白屏是常事,使用别的IDE开发如Sublime.FlashDevelop.IDEA等,然后再用mxmlc编译出 ...

  7. 数据库日常维护-CheckList_03有关数据库数据文件大小检查

    日常数据维护中容量规划是每个DBA的基础工作之一,也是非常重要的工作.在生产环境中一些比较重要的业务数据库会用前期容量规划不足,或出现意外的爆发式的数据增长,直至盛满整个磁盘空间,系统会无法使用,最终 ...

  8. 解决ASP.NET上传文件大小限制

    第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRuntime节点对于asp.net,默认只允许上传4M文件,增加如下配置,一般可以自定义最大文件大小.一.修改 ...

  9. iOS PhotoKit框架如何获取视频文件大小

    // 获取相册中的资源[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUI ...

随机推荐

  1. bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 594  Solved: 360[Submit][Statu ...

  2. [hdu2167]Pebbles

    来自FallDream的博客,未经允许,请勿转载,谢谢. 给定一个方阵,你要取出一些数字,满足没有两个格子八联通相邻的前提下和最大,求这个和 n<=15 插头dp,保存轮廓线以及目前转移点左上方 ...

  3. Python 中的 if __name__ == '__main__' 该如何理解

    __name__ 表示当前模块名, __main__ 表示正在运行的模块名. if __name__ == '__main__' 这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导 ...

  4. ES6(数组)

    ES6数组新增特性 1. 空数组 2.将伪数组转换成真正的数组 将 p 标签集合转换成真正数组 类似于map的用法,转换数组同时还在遍历. 3.填充数组(将所有数组换成一个值) 1代表起始位置,3代表 ...

  5. Linux学习之CentOS(二)--初识linux的一些常用命令(基础命令)

    初次学习linux系统,首先也得会一些linux的基本命令.至少要先学会开启和关闭系统吧!我称为 基础命令! linux命令是对Linux系统进行管理的命令.对于Linux系统来说,无论是中央处理器. ...

  6. js匿名函数,闭包

    http://www.cnblogs.com/chenxianbin89/archive/2010/01/28/1658392.html

  7. mysql获取某个表的所有字段名

    http://www.netingcn.com/mysql-column-name.html mysql安装成功后可以看到已经存在mysql.information_schema和test这个几个数据 ...

  8. ajax中基本参数应用

    $(function () { $("#verificationCodeBtn").click(function () { $("#verificationCodeIma ...

  9. 数据结构之Treap

    1. 概述 同splay tree一样,treap也是一个平衡二叉树,不过Treap会记录一个额外的数据,即优先级.Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质.因而,Treap ...

  10. Linux下查看alert日志文件的两种方法

    --linux下查看alert日志文件的两种方法: --方法1: SQL> show parameter background_dump_dest; NAME TYPE VALUE ------ ...