linux下stat详解--相关函数

stat函数讲解

表头文件:    #include
                     #include
定义函数:    
int stat(const char *file_name, struct stat *buf);
函数说明:    
通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
返回值:        
执行成功则返回0,失败返回-1,错误代码存于errno

错误代码:
    ENOENT         参数file_name指定的文件不存在
    ENOTDIR        路径中的目录存在但却非真正的目录
    ELOOP          欲打开的文件有过多符号连接问题,上限为16符号连接
    EFAULT         参数buf为无效指针,指向无法存在的内存空间
    EACCESS        存取文件时被拒绝
    ENOMEM         核心内存不足
    ENAMETOOLONG   参数file_name的路径名称太长
-------------------------------------------------------------------------------------------------
#include
#include
#include

int main() {
    struct stat buf;
    stat("/etc/hosts", &buf);
    printf("/etc/hosts file size = %d/n", buf.st_size);
}

------------------------------------------------------------------------------------------------

stat 结构体定义:

struct stat {
    dev_t         st_dev;       //文件的设备编号
    ino_t         st_ino;       //节点
    mode_t        st_mode;      //文件的类型和存取的权限
    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t         st_uid;       //用户ID
    gid_t         st_gid;       //组ID
    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
    off_t         st_size;      //文件字节数(文件大小)
    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
    unsigned long st_blocks;    //块数
    time_t        st_atime;     //最后一次访问时间
    time_t        st_mtime;     //最后一次修改时间
    time_t        st_ctime;     //最后一次改变时间(指属性)
};

st_mode是用特征位来表示文件类型的,特征位的定义如下:

S_IFMT          0170000     文件类型的位遮罩
S_IFSOCK        0140000     socket                                             ("s")
S_IFLNK         0120000     符号链接(symbolic link)                   ("l")
S_IFREG         0100000     一般文件                                           ("-")
S_IFBLK         0060000     区块装置(block device)                    ("b")           
S_IFDIR         0040000     目录                                                   ("d")
S_IFCHR         0020000     字符装置(character device)             ("c")
S_IFIFO         0010000     先进先出(fifo)                                    ("p")
S_ISUID         0004000     文件的(set user-id on execution)位
S_ISGID         0002000     文件的(set group-id on execution)位
S_ISVTX         0001000     文件的sticky位
S_IRWXU         00700       文件所有者的遮罩值(即所有权限值)
S_IRUSR         00400       文件所有者具可读取权限
S_IWUSR         00200       文件所有者具可写入权限
S_IXUSR         00100       文件所有者具可执行权限
S_IRWXG         00070       用户组的遮罩值(即所有权限值)
S_IRGRP         00040       用户组具可读取权限
S_IWGRP         00020       用户组具可写入权限
S_IXGRP         00010       用户组具可执行权限
S_IRWXO         00007       其他用户的遮罩值(即所有权限值)
S_IROTH         00004       其他用户具可读取权限
S_IWOTH         00002       其他用户具可写入权限
S_IXOTH         00001       其他用户具可执行权限

---------------------------------------------------------------------------------------

判断文件类型时,用对文件的st_mode的值与上面给出的值相与,再比较。比如:

---------------------------------------------------------------------------------------

int abc;  
    struct stat buf;  
    stat("/home", &buf);  
    abc = buf.st_mode & S_IFDIR;//与对应的标志位相与  
    if(abc == S_IFDIR)          //结果与标志位比较  
        printf("It's a directory.\n");  

---------------------------------------------------------------------------------------

简单的方法:

S_ISLINGK(st_mode)      判断是否位符号链接  
S_ISREG(st_mode)        是否为一般文件  
S_ISDIR(st_mode)        是否为目录  
S_ISCHR(st_mode)        是否位字符装置文件  
S_ISBLK(s3e)            是否先进先出  
S_ISSOCK(st_mode)       是否为socket

-------------------------------------------------------------------------------------

sys/stat.h文件中的宏定义:
#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG )
#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR )
#define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK )
#define S_ISCHR (mode) (((mode) & S_IFMT) == S_IFCHR)
#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFFIFO)
#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK )
#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)

你可能感兴趣的:(C++,Linux,C)