linux下C获取文件的大小

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

方法一

范例:

unsigned long get_file_size(const char *path)  
{  
    unsigned long filesize = -1;  
    FILE *fp;  
    fp = fopen(path, "r");  
    if(fp == NULL)  
        return filesize;  
    fseek(fp, 0L, SEEK_END);  
    filesize = ftell(fp);  
    fclose(fp);  
    return filesize;  
}

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

方法二

范例:

   #include <sys/stat.h>     
   unsigned long get_file_size(const char *path)  
   {  
        unsigned long filesize = -1;      
        struct stat statbuff;  
        if(stat(path, &statbuff) < 0){  
            return filesize;  
        }else{  
            filesize = statbuff.st_size;  
        }  
        return filesize;  
    }

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

stat的详细信息

stat(取得文件状态)
相关函数

fstat,lstatchmodchownreadlinkutime 

表头文件

#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、readwrite与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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值