用stat函数获取文件信息

本文介绍了Linux系统中stat函数的使用,特别是聚焦于st_mode成员的解析。通过示例展示了如何判断文件类型和文件所有者的执行权限。通过编写测试用例,读者可以进一步了解如何实际操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 前面我们初步认识了stat这个函数,并用它学会了查看文件的大小:linux 用stat 函数来查看文件大小

现在我们来再看看stat 结构体中的 st_mode 成员,st_mode 其实是2byte的16bit的数,下面是用八进制表示的st_mode ,总共包含了下面这些情况:

    S_IFMT   0170000    掩码
    S_IFSOCK 0140000    套接字
    S_IFLNK 0120000     符号连接(软链接)
    S_IFREG 0100000     一般文件
    S_IFBLK 0060000     块设备
    S_IFDIR 0040000     目录
    S_IFCHR 0020000     字符设备
    S_IFIFO 0010000     管道

    S_ISUID 04000     文件的(set user-id on execution)位
    S_ISGID 02000     文件的(set group-id on execution)位
    S_ISVTX 01000     文件的sticky位

    S_IRUSR(S_IREAD) 00400     文件所有者具可读取权限
    S_IWUSR(S_IWRITE)00200     文件所有者具可写入权限
    S_IXUSR(S_IEXEC) 00100     文件所有者具可执行权限
    上面这三个用 (S_IRWXU) 00700 的掩码;

    S_IRGRP 00040             用户组具可读取权限
    S_IWGRP 00020             用户组具可写入权限
    S_IXGRP 00010             用户组具可执行权限
    上面这三个用 (S_IRWXG) 00070 的掩码;    

    S_IROTH 00004             其他用户具可读取权限
    S_IWOTH 00002             其他用户具可写入权限
    S_IXOTH 00001             其他用户具可执行权限
    上面这三个用 (S_IRWXO) 00007 的掩码;

下面我们来举两个例子,看如何使用:

我们可以用如下的语句来判断文件类型:

if((s.st_mode & S_IFMT) == S_IFREG )//则说明这个文件 s 的文件类型是普通文件

我们可以用如下的语句来判断文件所有者是否具有可执行权限:

if(s.st_mode & S_IXUSR)//则说明这个文件 s 的所有者有可执行权限

 我们接着写一个测试用例:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/types.h>
  4 #include<unistd.h>
  5 #include<sys/stat.h>
  6 #include<string.h>
  7 
  8 int main(){
  9     struct stat st;
 10     int ret = stat("test.c",&st);
 11     if(ret == -1){
 12         perror("stat error");
 13         exit(1);
 14     }
 15 
 16     printf("file size == %d\n",(int)st.st_size);
 17     //判断文件类型是不是普通文件
 18     if((st.st_mode & S_IFMT) == S_IFREG ){
 19         printf("这是一个普通文件\n");
 20     }
 21     if(st.st_mode & S_IRUSR){
 22         printf("  r\n");
 23     }
 24     if(st.st_mode & S_IWUSR){
 25         printf("  w\n");
 26     }
 27     if(st.st_mode & S_IXUSR){
 28         printf("  x\n");
 29     }
 30     return 0;
 31 }

编译运行后: 

 不多说,自行体会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值