Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1748569
  • 博文数量: 199
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 6186
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-30 11:01
个人简介

Linuxer.

文章存档

2015年(4)

2014年(28)

2013年(167)

分类: LINUX

2013-11-07 15:36:21

1. ftell

[cpp]
  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. }    


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

2. stat

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


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

 

stat的详细信息如下所示:

 1) stat(取得文件状态)     
相关函数     fstat,lstat,chmod,chown,readlink,utime 
  
2) 表头文件    

#include  
#include  
  
3) 定义函数     int   stat(const   char   *   file_name, struct   stat   *buf); 
  
4) 函数说明

     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的路径名称太长 

5) 范例

[cpp]
  1. #include     
  2. #include     
  3. mian()   
  4. {   
  5. struct   stat   buf;   
  6. stat   (“/etc/passwd”,&buf);   
  7. printf(“/etc/passwd   file   size   =   %d   /n”,buf.st_size);   
  8. }   

执行结果:/etc/passwd   file   size   =   705

阅读(1534) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~