c获取文件大小

方法一

stat,lstat,fstat

1 函数都是获取文件(普通文件,目录,管道,socket,字符,块)的属性。
函数原型
#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);
提供文件名字,获取文件对应属性。
int fstat(int filedes, struct stat *buf);
通过文件描述符获取文件对应的属性。
int lstat(const char *restrict pathname, struct stat *restrict buf);
连接文件描述符,获取文件属性。


2 文件对应的属性
struct stat {
        mode_t     st_mode;       //文件对应的模式,文件,目录等
        ino_t      st_ino;       //inode节点号
        dev_t      st_dev;        //设备号码
        dev_t      st_rdev;       //特殊设备号码
        nlink_t    st_nlink;      //文件的连接数
        uid_t      st_uid;        //文件所有者
        gid_t      st_gid;        //文件所有者对应的组
        off_t      st_size;       //普通文件,对应的文件字节数
        time_t     st_atime;      //文件最后被访问的时间
        time_t     st_mtime;      //文件内容最后被修改的时间
        time_t     st_ctime;      //文件状态改变时间
        blksize_t st_blksize;    //文件内容对应的块大小
        blkcnt_t   st_blocks;     //伟建内容对应的块数量
      };


可以通过上面提供的函数,返回一个结构体,保存着文件的信息。


3.使用下面几个宏来判断.
S_ISLNK(st_mode):是否是一个连接.
S_ISREG是否是一个常规文件.
S_ISDIR是否是一个目录
S_ISCHR是否是一个字符设备.
S_ISBLK是否是一个块设备
S_ISFIFO是否是一个FIFO文件.

S_ISSOCK是否是一个SOCKET文件. 


方法二

fseek( fp, 0, SEEK_END );    // 将文件指针移到文件尾
fileSize = ftell( fp );     // 获取当前文件指针相对于文件首的偏移量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FILE    *fp   =   NULL;
long    fSet   =   0,   fEnd   =   0;
long    filelen   =   0;
char *   fname   =    "d:/test.txt "
 
if    (   (v_fpLog   =    fopen (   filename   ,    "r+ " ))   ==   NULL   )   {
printf (    "The   file   '%s '   was   not   opened\n " ,   filename   );
return ;
}
else    {
fseek (   v_fpLog,   0,   SEEK_SET   );
v_fSet   =    ftell (   v_fpLog   );
 
fseek (   v_fpLog,   0,   SEEK_END   );
v_fEnd   =    ftell (   v_fpLog   );
 
                   /*   file   lenght   */
                   flen   =   fEnd   -   fSet   ;
}


你可能感兴趣的:(c获取文件大小)