在Linux下用C语言程序获取指点文件大小

在Linux里面有一个标准io操作光标的函数off_t lseek(int fd, off_t offset, int whence);,直接用他把光标移到最末尾就行了,这个函数的返回值就是当前光标位置相对于最前面的偏移量。(单位是字节)当然你的加上相应的头文件。

int file_size(char* filename) 
{ 
    int fd = open(filename, O_RDONLY);//只读方式打开就够了
    off_t num = lseek(fd, 0, SEEK_END);
    close(fd);
    return num;
} 

当然你也可以使用系统io操作光标的函数int fseek(FILE *stream, long offset, int whence);,实现的思路也是一样的。

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

关于lseek与fseek的区别可以参考:https://blog.csdn.net/jaken99/article/details/77686427

这个两个方法效率都不是最高的,都要打开文件读取数据,而且fseek还要将数据读取到内存上来再操作,当数据很大的时候效率就会很低。而且超过2Gfseek还会报错。

在Linux下,还有一种更简单的方式,通过读取文件信息获得文件大小,这个时候就快的多。

int file_size2(char* filename) 
{ 
    struct stat sta; 
    stat(filename,&sta); 
    int size=sta.st_size;  
    return size; 
} 

文件会有一个文件属性,里面维护这么一个结构体。

SYNOPSIS:
       #include
       #include
       #include

           struct stat {
               dev_t     st_dev;         /*容纳该文件的那个设备的设备号 */
               ino_t     st_ino;         /*inode节点 */
               mode_t    st_mode;        /* 文件的权限位 */
               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 ID (if special file) */

               off_t     st_size;        /*这个文件的大小,单位字节*/
               blksize_t st_blksize;     /* Block size for filesystem I/O */
               blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */

               /* Since Linux 2.6, the kernel supports nanosecond
                  precision for the following timestamp fields.
                  For the details before Linux 2.6, see NOTES. */

               struct timespec st_atim;  /* Time of last access */
               struct timespec st_mtim;  /* Time of last modification */
               struct timespec st_ctim;  /* Time of last status change */

           #define st_atime st_atim.tv_sec      /* Backward compatibility */
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };
 

你可能感兴趣的:(linux,c语言)