13.2.3 文件状态和属性操作
来源:互联网 发布:网络直播 用英文怎么说 编辑:程序博客网 时间:2024/06/05 14:38
13.2.3 文件状态和属性操作
获取文件状态和属性操作可使用fstat()、lstat()和stat()这3个函数来操作。fstat()函数用来返回一个已打开文件的状态和属性信息,lstat()和stat()函数可对未打开文件进行操作。lstat()和stat()函数的区别是当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。它们的一般形式为:
fstat(文件标识符, struct stat *buf);
fstat(路径, struct stat *buf);
stat(路径, struct stat *buf);
其中结构体struct stat类型是stat.h函数库提供的一种用于保存文件类型的结构体。该结构体成员的意义如表13.5所示。
表13.5 stat结构体成员的意义
成 员 名 称
说 明
st_mode
文件权限和文件类型信息
st_ino
与该文件关联的inode
st_dev
文件保存在其上的设备
st_uid
文件所有者的用户身份标识
st_gid
文件群组的分组身份标识
st_atime
上次被访问时间
st_ctime
文件权限、所有者、群组或内容方面上次被修改时间
st_mtime
文件内容方面上次被修改时间
st_nlink
该文件上硬链接的个数
其中,st_mode与其他成员相比要复杂许多,必须使用标志与之进行按位与运算才能获得相应信息。与前面按位或运算比较可得知,按位与运算其实只是按位或运算的逆操作。st_mode的标志如表13.6所示。
表13.6 st_mode的标志
标 志 名 称
说 明
S_IFBLK
文件是一个特殊的块设备
S_IFDIR
文件是一个目录
S_IFCHR
文件是一个特殊的字符设备
S_IFIFO
文件是一个FIFO设备
S_IFREG
文件是一个普通文件
S_IFLNK
文件是一个符号链接
S_ISUID
文件设置了SUID位
S_ISGID
文件设置了SGID位
S_ISVTX
文件设置了sticky位
S_IFMT
文件类型
S_IRWXU
属主的读/写/执行权限,可以分成S_IXUSR、S_IRUSR、S_IWUSR
S_IRWXG
属组的读/写/执行权限,可以分成S_IXGRP、S_IRGRP、S_IWGR
S_IRWXO
其他用户的读/写/执行权限,可以分为S_IXOTH、S_IROTH、S_IWOTH
修改文件权限的系统调用函数是chmod(),它与shell中的命令chmod作用相似。chmod的一般形式是:chmod(路径,umask)。如果修改成功返回值为0,否则返回–1。下面通过一个例子简单演示这几个函数的用法。
#include <fcntl.h> // 提供open()函数
#include <sys/types.h> // 提供mode_t类型
#include <sys/stat.h> // 提供open()函数的符号
#include <unistd.h> // 提供close()函数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int f; // 声明变量f,用于保存文件标识符
const char *f_path = "test"; // 定义路径字符串
mode_t f_attrib; // 声明mode_t型变量,保存文件属性
struct stat *buf = malloc(sizeof(stat)); // 动态分配结构体*buf的内存
f_attrib = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
// 为umask变量赋值
f = creat(f_path, f_attrib); // 创建一个新文件,并设置访问权限
if (f == -1) { // 判断文件创建是否成功
puts("文件创建失败"); // 输出错误信息
return 1;
}
else
puts("文件创建成功"); // 输出成功信息
fstat(f, buf); // 通过文件标识符获取访问权限
if (buf->st_mode & S_IRUSR) // 引用buf内的信息读取权限
puts("所有者拥有读权限");
if (buf->st_mode & S_IRGRP)
puts("群组拥有读权限");
close(f); // 关闭文件
chmod(f_path, 0771); // 修改该文件的权限
stat(f_path, buf); // 通过路径获取访问权限
if (buf->st_mode & S_IWUSR) // 引用buf内的信息读取权限
puts("所有者拥有写权限");
if (buf->st_mode & S_IWGRP)
puts("群组拥有写权限");
free(buf); // 释放buf指针所指向的内存空间
return 0;
}
程序中首先声明了一个字符串常量指针*f_path,并为其赋值test,该字符串将作为目标文件的文件名。然后声明了mode_t类型的f_attrib变量,用来保存目标文件的属性。在为f_attrib变量赋值后,f_attirb变量代表文件所有者拥有读和写的权限,群组拥有读和写的权限,其他用户拥有读的权限。
creat()函数使用*f_path指针所指向的字符串作为文件名创建了一个新文件,f_attrib变量作为umask为新文件定义属性。如果文件创建成功,则输出相应消息,并将文件标识符保存到变量f中。
随后,fstat()函数通过f变量获得文件标识符,并将文件的权限信息传递到stat类型的结构体指针buf中。通过buf指针的st_mode成员与st_mode标志的按位与运算,可以获得该文件的权限信息。
用close()函数关闭文件标识符后,程序中又使用chmod()函数重新定义了*f_path字符串所指向文件的权限信息。权限值使用的是八进制常量0771,代表所有者和群组拥有读、写和执行权限,其他用户拥有读权限。
最后,程序中使用stat()函数直接以文件名作为参数读取了f_path字符串所指向文件的权限信息。并且将文件的权限信息传递到buf指针中,通过st_mode标志判断文件是否具备相应权限,并输出相关信息。
- 13.2.3 文件状态和属性操作
- Linux文件基本属性和操作
- 文件的属性和基本操作
- linux文件操作二(文件定位和状态函数)
- React属性和状态
- 属性和状态对比
- React 属性和状态
- [React]属性和状态
- PHP文件操作之文件的类型和属性
- linux 文件状态标识和IO操作方式
- 操作属性文件
- JAVA操作属性文件
- 操作属性文件
- 操作properties属性文件
- 操作properties属性文件
- java操作属性文件
- 操作properties属性文件
- 操作属性文件
- delphi 读取剪粘板内的html格式数据
- [转]解决调试AutoCAD 2006启动过程中的异常问题
- 13.2.2 打开文件、新建文件和关闭文件操作
- 成长的开始
- 减少QQ的内存占用
- 13.2.3 文件状态和属性操作
- C++编译过程中常见的一些错误
- 集群存储系统介绍
- 13.2.4 目录操作
- 13.2.5 删除目录或文件操作
- java 中 Timer 定时执行任务
- 13.2.6 错误处理
- 13.3 媒体播放器——增强媒体库功能
- 13.3.1 添加目录到媒体库