linux c下获取文件大小

一般在读取文件中的内容的时候,如果你不知道到底分配多大的空间,为何不先获取文件的大小,然后再……

这里贴出两种方法:

1.

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


2.

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


第一种:通过打开文件的方式seek得到文件大小,这种方式如果文件比较大,则效率可想而知。而且如果另外一个进程打开文件写的时候,冲突来了。

第二种:通过C语言的函数stat将文件先放到buffer中,然后获取buffer的大小,这种方式效率更高


例子:

struct   stat   buf; 
stat   (“/tmp/tmpfile”,&buf); 
printf(“/tmp/tmpfile   size   =   %d   /n”,buf.st_size); 


下面给出stat封装的结构

#ifdef __EXT_LF64SRC
struct stat64 {
ino64_t st_ino; /* File serial number. */
off64_t st_size;
_CSTD dev_t st_dev; /* ID of device containing file. */
_CSTD dev_t st_rdev; /* Device ID, for inode that is device */
uid_t st_uid;
gid_t st_gid;
_CSTD time_t st_mtime; /* Time of last data modification */
_CSTD time_t st_atime; /* Time last accessed */
_CSTD time_t st_ctime; /* Time of last status change */
_CSTD mode_t st_mode; /* see below */
nlink_t st_nlink;
blksize_t st_blocksize; /* Size of a block used by st_nblocks   */
_Int32t st_nblocks; /* Number of blocks st_blocksize blocks */
blksize_t st_blksize; /* Prefered I/O block size for object   */
blkcnt64_t st_blocks; /* Number of 512 byte blocks */
};
#endif

猜你喜欢

转载自blog.csdn.net/allen807733144/article/details/73604571
今日推荐