linux的stat/lstat函数和目录遍历函数使用

stat函数:

作用:获取文件属性

函数原型:int stat(const char *pathname, struct stat *statbuf);

返回值:成功返回0

               失败返回-1

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;        //文件大小(字节数)
               blksize_t st_blksize;     //块大小
               blkcnt_t  st_blocks;      //块数               

               struct timespec st_atim;  //最后一次访问时间
               struct timespec st_mtim;  //最后一次修改时间
               struct timespec st_ctim; //最后一次改变时间(指属性)

}

这是建立的stat.c文件

linux的stat/lstat函数和目录遍历函数使用_第1张图片

编译后可以用来访问test.log的属性。 

linux的stat/lstat函数和目录遍历函数使用_第2张图片

通过以下操作可以访问文件的类型:

     stat(pathname, &sb);
           if ((sb.st_mode & S_IFMT) == S_IFREG) {
               /* Handle regular file */
           }

           S_IFSOCK   0140000   socket
           S_IFLNK    0120000   symbolic link
           S_IFREG    0100000   regular file
           S_IFBLK    0060000   block device
           S_IFDIR    0040000   directory
           S_IFCHR    0020000   character device
           S_IFIFO    0010000   FIFO

 linux的stat/lstat函数和目录遍历函数使用_第3张图片

 成功:

 或者:

stat(pathname, &sb);
           if (S_ISREG(sb.st_mode)) {
               /* Handle regular file */
           }

           S_ISREG(m)  is it a regular file?

           S_ISDIR(m)  directory?

           S_ISCHR(m)  character device?

           S_ISBLK(m)  block device?

           S_ISFIFO(m) FIFO (named pipe)?

           S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.)

           S_ISSOCK(m) socket?  (Not in POSIX.1-1996.)

linux的stat/lstat函数和目录遍历函数使用_第4张图片
 

成功:

通过以下操作可以访问文件的权限:

stat(pathname, &sb);

if(sb.st_mode&S_IRUSR) 为真表示用户可读

if(sb.st_m&S_IWUSR) 为真表示用户可写

if(sb.st_mode&S_IXUSR) 为真表示用户可执行

if(sb.st_mode&S_IROTH) 为真表示其他人可读

if(sb.st_mode&S_IRGRP) 为真表示所属组可读

linux的stat/lstat函数和目录遍历函数使用_第5张图片

成功:

注意:使用stat函数时,获取软连接文件的属性时获取的是被指向文件的属性,而不是连接文件本身。

所以要使用lstat函数,可以获取软连接文件本身的属性

目录遍历函数:

opendir  :打开目录

 DIR *opendir(const char *name);
使用:先建立一个DIR *pDir=NULL;

然后pDir=opendir(const char *name);

readdir:循环读取目录项

struct dirent *readdir(DIR *dirp);

使用:先建立一个struct dirent *pDent=NULL;

通过while((pDent=opendir(pDir))!=NULL)来循环读取目录里的内容

以下是struct dirent的内容

struct dirent {
               ino_t          d_ino;       /* Inode number */
               off_t          d_off;       /* Not an offset; see below */
               unsigned short d_reclen;    /* Length of this record */
               unsigned char  d_type;      /* Type of file; not supported
                                              by all filesystem types */
               char           d_name[256]; /* Null-terminated filename */
           };
 

closedir :关闭目录

int closedir(DIR *dirp);

操作:
linux的stat/lstat函数和目录遍历函数使用_第6张图片

你可能感兴趣的:(linux,运维,服务器)