您的位置:首页 > 运维架构 > Linux

linux下C获取文件的大小 .

2015-01-20 09:09 344 查看
获取文件大小这里有两种方法:

方法一、

范例:

[cpp]
view plaincopyprint?

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;  
}  
  
      

[c-sharp]
view plaincopyprint?

#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;  
}  

#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,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 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: