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_IXUSRS_IRUSRS_IWUSR

S_IRWXG

属组的读//执行权限,可以分成S_IXGRPS_IRGRPS_IWGR

S_IRWXO

其他用户的读//执行权限,可以分为S_IXOTHS_IROTHS_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标志判断文件是否具备相应权限,并输出相关信息。

原创粉丝点击