Linux系统应用编程---文件属性 stat和access

stat函数

stat既有命令也有同名函数,用来获取文件Inode里主要信息,stat 跟踪符号链接,lstat不跟踪符号链接

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

int stat(const char *path, struct stat *buf);

int fstat(int fd, struct stat *buf);

int lstat(const char *path, struct stat *buf);

struct stat {

    dev_t st_dev; /* ID of device containing file */

    ino_t st_ino; /* inode number */

    mode_t st_mode; /* protection */

    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; /* total size, in bytes */

    blksize_t st_blksize; /* blocksize for file system I/O */

    blkcnt_t st_blocks; /* number of 512B blocks allocated */

    time_t st_atime; /* time of last access */

    time_t st_mtime; /* time of last modification */

    time_t st_ctime; /* time of last status change */

};

stat里面时间辨析

           atime(最近访问时间)

           mtime(最近更改时间):指最近修改文件内容的时间

           ctime(最近改动时间):指最近改动Inode的时间

一个stat应用的小例子,打印文件的inode、文件大小、文件系统I/O块大小

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>

#define NAME "1.txt"

int main(void)
{
       int ret = -1;
       struct stat buf;
      
       memset(&buf, 0, sizeof(buf));//memset之后buf中全是零

       ret = stat(NAME, &buf);               //stat后buf中有内容了             

       if(ret < 0)
       {
              perror("stat");

              exit(-1);
       }

       //成功获取了stat结构体,从中可以得到各种属性信息
       printf("inode = %d.\n",buf.st_ino);
       printf("st_size = %d.\n",buf.st_size);
       printf("st_blksize = %d.\n",buf.st_blksize);
      
       return 0;
}

执行结果:

 

access函数

#include <unistd.h>

int access(const char *pathname, int mode);

按实际用户ID和实际组ID测试,跟踪符号链接,参数mode

R_OK 是否有读权限

W_OK 是否有写权限

X_OK 是否有执行权限

F_OK 测试一个文件是否存在

实际用户ID与有效用户ID的解释:

sudo执行时,有效用户IDroot,实际用户ID是当前用户

实际应用中,access用的最多的是F_OK参数,去判断一个文件是否存在

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <error.h>
#include <errno.h>
#include <stdlib.h>

int main(void)
{
         if(access("abc", F_OK) < 0){
                  perror("access");
                  exit(1);
         }        

         printf("file abc is exist.\n");
        
        return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42445727/article/details/88983032