第四章:文件和目录



本章在第三章的基础上描述文件的属性,如大小、创建时间等。

本章最后介绍对目录进行操作的各个函数。



一、stat()、fstat()、fstatat()和lstat()

stat系列函数用于返回文件的属性信息,如文件类型、大小、所有者、访问修改时间等。函数声明如下:

 1 /* 文件属性查看函数 */
 2 #include <sys/stat.h>
 3
 4 int stat(const char *pathname, struct stat *buf);
 5 int fstat(int fd, struct stat *buf);
 6 int lstat(const char *pathname, struct stat *buf);
 7 int fstatat(int fd, const char *pathname, struct stat *buf, int flags);
 8
 9 /* 例子 */
10 struct stat st;
11 fstat(fd, &st);
12 char *buf;
13
14 if (S_ISREG(st.st_mode))
15     buf = "regular";             /* 普通文件 */
16 else if (S_ISDIR(st.st_mode))
17     buf = "directory";            /* 目录 */
18 else if (S_ISCHR(st.st_mode))
19     buf = "character special";    /* 字符文件 */
20 else if (S_ISBLK(st.st_mode))
21     buf = "block special";        /* 块文件 */
22 else if (S_ISFIFO(st.st_mode))
23     buf = "fifo";                 /* 管道文件 */
24 /*
25 else if (S_ISLINK(st.st_mode))
26     buf = "link";                 /* 链接文件,使用fstat()无法识别 */
27 */
28 else if (S_ISSOCK(st.st_mode))
29     buf = "socket";               /* 网络套接字 */
30 else
31     buf = "unknow mode";
32
33 printf("%s\n", buf);


函数参数以及返回值:

pathname:文件路径名

buf:返回的stat结构体

fd:文件打开函数返回的文件描述符

flags:标识符

返回值:成功返回0;出错返回-1。



上面函数返回的stat结构体各个实现可能存在差异,但它们都至少具备下列的信息:

 1 struct stat {
 2     mode_t                st_mode;    // 文件类型和访问权限
 3     ino_t                st_ino;        // 指向数据块的节点的编号
 4     dev_t                st_dev;        // 设备号
 5     dev_t                st_rdev;
 6     nlink_t                st_nlink;    // 硬链接数
 7     uid_t                st_uid;        // 用户ID
 8     gid_t                st_gid;        // 用户组ID
 9     off_t                st_size;
10     struct timespec        st_atim;    // 数据访问时间
11     struct timespec        st_mtim;    // 数据修改时间
12     struct timespec        st_ctim;    // 属性修改时间
13     blksize_t            st_blksize;    // 最好的IO块大小
14     blkcnt_t            st_blocks;
15 };

二、文件类型

UNIX系统中的文件大多数是普通文件和目录,但也存在其他类型的文件,其分类如下:

普通文件(regular file):包含数据的常规文件,数据可以是文本类型的,也可以是二进制的。

目录文件(directory file):它是一个目录,保存目录相关的信息。

块设备文件(block special file):这种文件提供对硬件(如磁盘)带缓冲的访问

字符设备文件(regular file):这种文件提供对硬件(如磁盘)不带缓冲的访问

FIFO:这种文件用于进程间通信。

套接字文件(regular file):这种文件用于网络间通信。

符号连接(regular file):类似Windows系统的快捷方式,指向另外一个文件。

以上文件类型的信息存储在前面说明的stat结构体中st_mode成员中的。正如我所给出的上面的例子,st_mode成员的读取是利用系统提供的宏函数进行的。在此我总结以下上文例子中的宏函数:

S_ISREG()        /* 普通文件 */
S_ISDIR()        /* 目录 */
S_ISCHR()        /* 字符文件 */
S_ISBLK()        /* 块文件 */
S_ISFIFO()        /* 管道文件 */
S_ISLINK()        /* 链接文件 */
S_ISSOCK()        /* 网络套接字 */

三、文件访问权限

stat结构体中st_mode成员还包含有文件的访问权限,访问权限曾在第三章第二节有简单的演示。

为了打开任意类型的一个文件,则需要对该文件所在的父级以及父级的父级等目录具有执行权限。删除一个文件不需要对该文件有任何权限,只需要对被删除文件的父级目录具有写和执行权限即可。

进程每次打开、创建或删除一个文件时,内核就对该文件进行访问权限测试,通常的步骤是:

1. 先判断进程是否是超级用户,即ID是否为0,是则允许访问,否则执行第二步;

2. 再判断进程的有效用户ID是否等于文件的所有者ID,如果是并且被访问文件设定了适当的读写权限,则允许访问;否则执行第三步;

3. 然后判断进程有效组ID或者附加组ID是否等于文件的组ID,如果是并且被访问文件设定了适当的读写权限,则允许访问;否则执行第四步;

4. 最后查看文件的其他用户是否有适当权限访问文件,有则允许,否则判断结束、访问失败。

四、access()和faccessat()

access()和faccessat()函数可用于判断当前用户是否具有访问某个文件的权限。函数声明如下:

 1 /* 权限检测函数 */
 2 #include <unistd.h>
 3
 4 int access(const char *pathname, int mode);
 5 int faccessat(int fd, const char *pathname, int mode, int flags);
 6
 7 /* 例子 */
 8 if (access("a.txt", R_OK) == 0)        /* 是否有读权限 */
 9     printf("a.txt read ok\n");
10 if (access("a.txt", W_OK) == 0)        /* 是否有写权限 */
11     printf("a.txt write ok\n");
12 if (access("a.txt", X_OK) == 0)        /* 是否有执行权限 */
13     printf("a.txt execute ok\n");


函数参数以及返回值:

pathname:文件路径名

mode:模式,包含有R_OK、W_OK、X_OK和F_OK

flags:标识符

返回值:有权限返回0



五、文件操作其他函数

权限屏蔽函数umask(),用于设置创建新文件时的权限屏蔽字,对于修改文件权限时权限屏蔽字没有效果,函数声明如下:

#include <sys/stat.h>

mode_t umask(mode_t mask);

/* 例子 */
mode_t old = umask(0222);    /* 如果原来的权限是0777,那么最终的结果是077 - 0222 = 0555,old返回原来的权限 */
umask(old);    /* 恢复权限 */

chmod()、fchmod()和fchmodat()这三个函数用于更改文件的访问权限。函数声明如下:

1 #include <sys/stat.h>
2
3 int chmod(const char *file, mode_t mode);
4 int fchmod(int fd, mode_t mode);
5 int fchmodat(int fd, const char *file, mode_t mode, int flag);
6
7 /* 例子 */
8 fchmod(fd, 0666);    /* 更改权限为0666 */

权限改变成功则返回0,失败返回-1。

六、目录相关函数

 1 #include <dirent.h>
 2
 3 /* 打开一个目录 */
 4 DIR *opendir(const char *name);    // 成功返回指针,失败返回NULL
 5 DIR *fdopendir(int fd);                     // 成功返回指针,失败返回NULL
 6
 7 /* 读取目录中的内容,如文件、子目录 */
 8 struct dirent *readdir(DIR *dirp);     // 成功返回指针,失败返回NULL
 9
10 /* 让目前的读取位置还原到开头的读取位置 */
11 void rewinddir(DIR *dirp);
12
13 /* 设置相对于开头偏移值为pos的读取位置 */
14 void seekdir(DIR *dirp, long int pos);
15
16 /* 关闭目录 */
17 int closedir(DIR *dirp);                // 成功时返回0,失败返回-1
18
19 /* 例子 */
20 DIR* dir = opendir("../");
21 struct dirent* ent;
22 while(ent=readdir(dir)) // 1 读, 2 =,3 判断ent是否为0
23 {
24     printf("%d, %s\n", ent->d_type, ent->d_name);
25 }    // d_tpye == 4 的是目录
26 closedir(dir);

读某个目录内容(子项)的步骤:
1. opendir()返回目录指针
2. 循环调用readdir(),逐一读取每个子项
3. closedir()关闭目录,这步也可以省略

原文地址:https://www.cnblogs.com/Lioker/p/10682870.html

时间: 2024-11-10 10:54:22

第四章:文件和目录的相关文章

APUE学习笔记:第四章 文件和目录

4.1 引言 本章将描述文件的特征和文件的性质 4.2 stat.fstat和lstat函数 #include<sys/stat.h> int stat(const char *restrict pathname,struct stat *restrict buf); int fstat(int filedes,struct stat *buf) int lstat(const char *restrict pathname,struct stat *restrict buf); 三个函数的返

APUE读书笔记-第四章 文件和目录

到第四章了,不知什么时候才能把这本书看完,耽误的时间太多了. 第四章是在第三章的基础上,主要描述文件系统的其他性质和文件的性质. 4.2 stat.fstat.fstatat.lstat函数 首先来看看这四个函数的原型: #include <sys/stat.h> ///usr/include/x86_64-linux-gnu/sys/ int stat (const char *__restrict __file, struct stat *__restrict __buf) int fst

第四章 文件和目录

本章主要介绍文件目录的创建.删除.读写.设置访问权限以及获取文件或目录的属性等: 唯一需要强调的可能就是:目录也是一种文件 获取文件目录的属性 关键函数 stat/fstat/lstat用于获取文件的信息,如文件的所有者,权限,修改和访问时间等等 #include <sys/stat.h> int fstat(int fildes, struct stat *buf); // 获取已打开的文件的相关信息 int fstat64(int fildes, struct stat64 *buf);

apue第四章 文件和目录

函数stat,fstat,fstatat, lstat #include <sys/stat.h> int stat(const char *restrict pathname, struct stat *restrict buf); int fstat(int fd, struct stat *buf); int lstat(const char *restrict pathname, struct stat *restrict buf); int lstat(int fd, const c

《python编程》第四章——文件和目录工具

1.文件和目录,他们本身就是我们在电脑里看到的那些一个个文件.目录在windows中就是文件夹,很好理解. 2.我们用到的大多数用途,就是利用open内建函数及其文件对象来处理文件. 3.open函数返回的文件对象有多种方法,read,readline,readlines,write,writelines,close,seek,flush(将缓存区的数据强制转移到磁盘),fileno(获取底层的文件句柄)等. 4.打开一个文件的整个步骤都是分为三步的,1.打开,同时指定打开来做什么用(比如wri

第四章 文件的基本管理和XFS文件系统备份恢复

第四章 文件的基本管理和XFS文件系统备份恢复 本节所讲内容: 4.1 Linux系统目录结构和相对/绝对路径. 4.2 创建/复制/删除文件,rm -rf / 意外事故 4.3 查看文件内容的命令 4.4 实战:xfs文件系统的备份和恢复   4.1 Linux系统目录结构和相对/绝对路径 4.1.1系统目录结构 在WIN系统中,查看文件先进入相应的盘符,然后进入文件目录 ?? 在WIN中,它是多根 c:\ d:\ e:\ Linux只有一个根目录   ?? 使用tree命令查看linux目录

分分钟钟学会Python - 第四章 文件操作

第四章 文件操作 4.1 文件基本操作 obj = open('路径',mode='模式',encoding='编码') obj.write() # 写入 obj.read() # 读取 obj.close() #关闭 4.2 打开模式 r / w / a [只读只写字符串] * r+ / w+ / a+ [可读可写字符串] rb / wb / ab [只读只写二进制] * r+b / w+b / a+b [可读可写二进制] 4.3 操作 read() , 全部读到内存 read(1) 1表示一

python第四章文件操作

第四章 文件操作 4.1 文件基本操作 obj = open('路径',mode='模式',encoding='编码') # 打开文件 obj.write() # 把内容写入文件 obj.read() # 读取文件内容 obj.close() # 关闭文件(保存文件,把内存上的数据写入到文件上-->硬盘上,01010101存储的) # 3步:1.打开文件. 2. 操作文件 3. 关闭文件 4.2打开文件 4.2.1语句 file = open('文件路径',mode = 'r',encoding

第四章文件操作

第四章 文件操作 4.1 文件基本操作 obj = open('路径',mode='模式',encoding='编码') obj.write() obj.read() obj.close() with open... 4.2 打开模式 r / w / a r+ / w+ / a+ rb / wb / ab r+b / w+b / a+b 4.3 操作 read() , 全部读到内存 read(1) 1表示一个字符 obj = open('a.txt',mode='r',encoding='utf

四. Linux文件与目录权限

文件与目录权限,umask, chgrp, chown, chmod 1. 文件与目录权限 (1) 查看/etc/passwd文件属性 [[email protected] ~]# ll -h --full-time /etc/passwd [[email protected] ~]#-rw-r--r--. 1 root root 2.3K 2016-11-09 21:07:03.303125300 +0800 /etc/passwd (2) 文件和目录权限的意义 文件权限 r(read) :