获取文件大小这里有两种方法:

方法一、

范例:

  1. unsigned long get_file_size(const char *path)
  2. {
  3. unsigned long filesize = -1;
  4. FILE *fp;
  5. fp = fopen(path, "r");
  6. if(fp == NULL)
  7. return filesize;
  8. fseek(fp, 0L, SEEK_END);
  9. filesize = ftell(fp);
  10. fclose(fp);
  11. return filesize;
  12. }

此种以打开文件的方法取得文件的大小,不适合大文件,并且可能会出现访问冲突(比如正在下载的文件),效率也比较低

方法二、

范例:

  1. #include <sys/stat.h>
  2. unsigned long get_file_size(const char *path)
  3. {
  4. unsigned long filesize = -1;
  5. struct stat statbuff;
  6. if(stat(path, &statbuff) < 0){
  7. return filesize;
  8. }else{
  9. filesize = statbuff.st_size;
  10. }
  11. return filesize;
  12. }

此种使用读取文件属性的方法得到文件的大小,效率较高,也较稳定

下面将stat的详细信息粘贴出来:

stat(取得文件状态)     
相关函数     fstat,lstat,chmod,chown,readlink,utime 
  
表头文件     #include <sys/stat.h> 
#include <unistd.h> 
  
定义函数     int   stat(const   char   *   file_name,struct   stat   *buf); 
  
函数说明     stat()用来将参数file_name所指的文件状态,复制到参数buf所指的结构中。 
下面是struct   stat内各参数的说明 
struct   stat 

dev_t   st_dev;   /*device*/ 
ino_t   st_ino;   /*inode*/ 
mode_t   st_mode;   /*protection*/ 
nlink_t   st_nlink;   /*number   of   hard   links   */ 
uid_t   st_uid;   /*user   ID   of   owner*/ 
gid_t   st_gid;   /*group   ID   of   owner*/ 
dev_t   st_rdev;   /*device   type   */ 
off_t   st_size;   /*total   size,   in   bytes*/ 
unsigned   long   st_blksize;   /*blocksize   for   filesystem   I/O   */ 
unsigned   long   st_blocks;   /*number   of   blocks   allocated*/ 
time_t   st_atime;   /*   time   of   lastaccess*/ 
time_t   st_mtime;   /*   time   of   last   modification   */ 
time_t   st_ctime;   /*   time   of   last   change   */ 
}; 
st_dev   文件的设备编号 
st_ino   文件的i-node 
st_mode   文件的类型和存取的权限 
st_nlink   连到该文件的硬连接数目,刚建立的文件值为1。 
st_uid   文件所有者的用户识别码 
st_gid   文件所有者的组识别码 
st_rdev   若此文件为装置设备文件,则为其设备编号 
st_size   文件大小,以字节计算 
st_blksize   文件系统的I/O   缓冲区大小。 
st_blcoks   占用文件区块的个数,每一区块大小为512   个字节。 
st_atime   文件最近一次被存取或被执行的时间,一般只有在用mknod、utime、read、write与tructate时改变。 
st_mtime   文件最后一次被修改的时间,一般只有在用mknod、utime和write时才会改变 
st_ctime   i-node最近一次被更改的时间,此参数会在文件所有者、组、权限被更改时更新先前所描述的st_mode   则定义了下列数种情况 
S_IFMT   0170000   文件类型的位遮罩 
S_IFSOCK   0140000   scoket 
S_IFLNK   0120000   符号连接 
S_IFREG   0100000   一般文件 
S_IFBLK   0060000   区块装置 
S_IFDIR   0040000   目录 
S_IFCHR   0020000   字符装置 
S_IFIFO   0010000   先进先出 
S_ISUID   04000   文件的(set   user-id   on   execution)位 
S_ISGID   02000   文件的(set   group-id   on   execution)位 
S_ISVTX   01000   文件的sticky位 
S_IRUSR(S_IREAD)   00400   文件所有者具可读取权限 
S_IWUSR(S_IWRITE)00200   文件所有者具可写入权限 
S_IXUSR(S_IEXEC)   00100   文件所有者具可执行权限 
S_IRGRP   00040   用户组具可读取权限 
S_IWGRP   00020   用户组具可写入权限 
S_IXGRP   00010   用户组具可执行权限 
S_IROTH   00004   其他用户具可读取权限 
S_IWOTH   00002   其他用户具可写入权限 
S_IXOTH   00001   其他用户具可执行权限 
上述的文件类型在POSIX   中定义了检查这些类型的宏定义 
S_ISLNK   (st_mode)   判断是否为符号连接 
S_ISREG   (st_mode)   是否为一般文件 
S_ISDIR   (st_mode)是否为目录 
S_ISCHR   (st_mode)是否为字符装置文件 
S_ISBLK   (s3e)   是否为先进先出 
S_ISSOCK   (st_mode)   是否为socket 
若一目录具有sticky   位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名。 
  
返回值     执行成功则返回0,失败返回-1,错误代码存于errno 
  
错误代码     ENOENT   参数file_name指定的文件不存在 
ENOTDIR   路径中的目录存在但却非真正的目录 
ELOOP   欲打开的文件有过多符号连接问题,上限为16符号连接 
EFAULT   参数buf为无效指针,指向无法存在的内存空间 
EACCESS   存取文件时被拒绝 
ENOMEM   核心内存不足 
ENAMETOOLONG   参数file_name的路径名称太长 
  
范例     #include <sys/stat.h> 
#include <unistd.h> 
mian() 

struct   stat   buf; 
stat   (“/etc/passwd”,&buf); 
printf(“/etc/passwd   file   size   =   %d   /n”,buf.st_size); 

  
执行     /etc/passwd   file   size   =   705

linux下C获取文件的大小的更多相关文章

  1. Linux C 获取 文件的大小

    通过Linux C库函数来获取文件的大小 #include <unistd.h> #include <sys/types.h> #include <sys/stat.h& ...

  2. Linux下几种文件传输命令

    Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...

  3. Linux下java获取CPU、内存、磁盘IO、网络带宽使用率

    一.CPU 使用proc文件系统,"proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口.用户和应用程序可以通过proc得 ...

  4. Linux下校验下载文件的完整性(MD5,SHA1,PGP)

    查看: Linux下校验下载文件的完整性(MD5,SHA1,PGP) http://blog.useasp.net/archive/2014/03/29/use-md5-sha1-or-pgp-to- ...

  5. Linux中查看各文件夹大小(扫盘)

    df -h ./ du -hs ./ du -h /ifs4/BC_RD/USER/lizhixin/my_project/human_chr22 | grep [[:digit:]+]G du [- ...

  6. Linux中查看各文件夹大小命令:du -h --max-depth=1

    Linux中查看各文件夹大小命令:du -h --max-depth=1 du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-siz ...

  7. Linux下打开超大文件的方法

    Linux下打开超大文件方法 在Linux下用VIM打开大小几个G.甚至几十个G的文件时,是非常慢的. 这时,我们可以利用下面的方法分割文件,然后再打开. 1 查看文件的前多少行 head -1000 ...

  8. 用脚本如何实现将Linux下的txt文件批量转化为Windows下的txt文件?

    众所周知,Windows和Linux的文件换行回车格式不同,Windows下换行格式是\r\n(回车+换行),Linux下换行格式为\n(只是换行),因此,其中一个操作系统的文本文件若需要在另外一个中 ...

  9. 【Linux学习】Linux下用户组、文件权限详解

    原文地址:http://www.cnblogs.com/123-/p/4189072.html Linux下用户组.文件权限详解 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在li ...

随机推荐

  1. 20175312 2018-2019-2 《Java程序设计》第7周学习总结

    20175312 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 已依照蓝墨云班课的要求完成了第八章的学习,主要的学习渠道是PPT,和书的课后习题. 总结如下 ...

  2. java.io.IOException: Attempted read from closed stream

    前言: 代码如下,执行的时候提示"java.io.IOException: Attempted read from closed stream." public static JS ...

  3. Python玩转Arduino——简单介绍

    关于Python语言的介绍安装请参考廖雪峰的Python教程 Python是一门解释型语言,虽然不能够像c语言一样编译上传到Arduino--什么你说MicroPython,我们再说Arduino呢- ...

  4. vue-router 中踏过的坑

    1.做完页面滚动,然后再加上路由,发现路由一直跳转不了,经历千辛万苦才发现是BScroll没有配置click:true,当看过文档时心里一万只草泥马奔腾而过,我预感到成长道路上还有多少坑在等着我. 2 ...

  5. java笔记 -- 输入输出

    读取输入: 如果想通过控制台进行输入, 首先需要构造一个Scanner对象.并与'标准输入流'System.in关联. 代码见下文代码块. Sanner (InputStream in) 用给定的输入 ...

  6. pycharm上传代码到远程服务器

    本来不打算写了,可是,还是记不住 源自https://blog.csdn.net/zhangyu4863/article/details/80188207 我的是pycharm2018.1.4专业版: ...

  7. webdirver.Chrom() selenium webdirver调用谷歌浏览器的问题解决

    第一个坑: 没有将谷歌驱动放到   /usr/local/bin  目录下 第二个坑: 没有将谷歌浏览器.exe放在    /usr/local/bin  目录下(注意:驱动和浏览器在一个路径下才能使 ...

  8. 别让持续交付自动化交付bug

    你的连续交付能力用得还好吗,比如频繁发布移动或云应用的特性增强?还是恰好相反,快速发布了带漏洞的版本? - Joel Shore 连续交付能让交付流程跑得更快,但连续交付本身并不能为发布质量打包票.国 ...

  9. 下载网站js css img 资源

  10. day1扩展作业

    作业一:博客作业二:编写登陆接口,●输入用户名密码(有文件存储用户名,命名)●认证成功后显示欢迎信息●输错三次后锁定(再次运行程序,还是输入上次输入的就显示已被锁定)作业三:多级菜单●三级菜单 ●可依 ...