博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获取一个文件的属性(struct stat结构体)
阅读量:4298 次
发布时间:2019-05-27

本文共 2081 字,大约阅读时间需要 6 分钟。

1 头文件

#include 
#include
1
2

2 作用/功能

描述一个linux系统文件系统中的文件属性的结构

3 获取一个文件的属性的两种方法

(1)通过路径

int stat(const char *path, struct stat *struct_stat);int lstat(const char *path,struct stat *struct_stat); 
1
2

两个函数的第一个参数都是文件的路径,第二个参数是struct stat的指针。返回值为0,表示成功执行。

执行失败是,error被自动设置为下面的值:

EBADF: 文件描述词无效

EFAULT: 地址空间不可访问

ELOOP: 遍历路径时遇到太多的符号连接

ENAMETOOLONG:文件路径名太长

ENOENT:路径名的部分组件不存在,或路径名是空字串

ENOMEM:内存不足

ENOTDIR:路径名的部分组件不是目录

这两个方法区别在于stat没有处理字符链接(软链接)的能力,如果一个文件是符号链接,stat会直接返回它所指向的文件的属性;而lstat返回的就是这个符号链接的内容。这里需要说明一下的是软链接和硬链接的含义。我们知道目录在linux中也是一个文件,文件的内容就是这这个目录下面所有文件与inode的对应关系。那么所谓的硬链接就是在某一个目录下面将一个文件名与一个inode关联起来,其实就是添加一条记录!而软链接也叫符号链接更加简单了,这个文件的内容就是一个字符串,这个字符串就是它所链接的文件的绝对或者相对地址。

(2)通过文件描述符

int fstat(int fdp, struct stat *struct_stat);  //通过文件描述符获取文件对应的属性。fdp为文件描述符 
1

下面是这个结构的结构

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; //伟建内容对应的块数量}; 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

stat结构体中的st_mode 则定义了下列数种情况: 
S_IFMT 0170000 文件类型的位遮罩 
S_IFSOCK 0140000 scoket 
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_IRGRP 00040 用户组具可读取权限 
S_IWGRP 00020 用户组具可写入权限 
S_IXGRP 00010 用户组具可执行权限

S_IROTH 00004 其他用户具可读取权限 
S_IWOTH 00002 其他用户具可写入权限 
S_IXOTH 00001 其他用户具可执行权限

上述的文件类型在POSIX中定义了检查这些类型的宏定义: 
S_ISLNK (st_mode) 判断是否为符号连接 
S_ISREG (st_mode) 是否为一般文件 
S_ISDIR (st_mode) 是否为目录 
S_ISCHR (st_mode) 是否为字符装置文件 
S_ISBLK (s3e) 是否为先进先出 
S_ISSOCK (st_mode) 是否为socket 
若一目录具有sticky位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名,在linux中,最典型的就是这个/tmp目录。 

转载地址:http://xunws.baihongyu.com/

你可能感兴趣的文章
cant connect to local MySQL server through socket /tmp/mysql.sock (2)
查看>>
vue中的状态管理 vuex store
查看>>
Maven之阿里云镜像仓库配置
查看>>
Maven:mirror和repository 区别
查看>>
微服务网关 Spring Cloud Gateway
查看>>
SpringCloud Feign的使用方式(一)
查看>>
SpringCloud Feign的使用方式(二)
查看>>
关于Vue-cli+ElementUI项目 打包时排除Vue和ElementUI
查看>>
Vue 路由懒加载根据根路由合并chunk块
查看>>
vue中 不更新视图 四种解决方法
查看>>
MySQL 查看执行计划
查看>>
OpenGL ES 3.0(四)图元、VBO、VAO
查看>>
OpenGL ES 3.0(五)纹理
查看>>
OpenGL ES 3.0(八)实现带水印的相机预览功能
查看>>
OpenGL ES 3.0(九)实现美颜相机功能
查看>>
FFmpeg 的介绍与使用
查看>>
Android 虚拟机简单介绍——ART、Dalvik、启动流程分析
查看>>
原理性地理解 Java 泛型中的 extends、super 及 Kotlin 的协变、逆变
查看>>
FFmpeg 是如何实现多态的?
查看>>
FFmpeg 源码分析 - avcodec_send_packet 和 avcodec_receive_frame
查看>>