C语言目录和文件操作扩展
本章节扩展一些目录和文件操作的更多知识,因为这些知识涉及到时间操作,所以放在时间操作之后的章节中介绍。
一、access库函数
access函数用于判断当前操作系统用户对文件或目录的存取权限。
包含头文件:
1 |
函数声明:
1 | int access(const char *pathname, int mode); |
参数说明:
pathname文件名或目录名,可以是当前目录的文件或目录,也可以列出全路径。
mode 需要判断的存取权限。在头文件unistd.h中的预定义如下:
1 |
返回值:
当pathname满足mode的条件时候返回0,不满足返回-1。
在实际开发中,access函数主要用于判断文件或目录是否是存在。
二、stat库函数
1、stat结构体
struct stat结构体用于存放文件和目录的状态信息,如下:
1 | struct stat |
struct stat结构体的成员变量比较多,对程序员来说,重点关注st_mode、st_size和st_mtime成员就可以了。注意st_mtime是一个整数表达的时间,需要程序员自己写代码转换格式。
st_mode成员的取值很多,或者使用如下两个宏来判断。
1 | S_ISREG (st_mode) 是否为一般文件 |
2、stat库函数
包含头文件:
1 |
函数声明:
1 | int stat(const char *path, struct stat *buf); |
stat函数获取path指定文件或目录的信息,并将信息保存到结构体buf中,执行成功返回0,失败返回-1。
示例(book145.c)
1 | /* |
运行效果
三、utime库函数
utime函数用于修改文件的存取时间和更改时间。
包含头文件:
1 |
函数声明:
1 | int utime(const char *filename, const struct utimbuf *times); |
函数说明:utime()用来修改参数filename 文件所属的inode存取时间。如果参数times为空指针(NULL),
则该文件的存取时间和更改时间全部会设为目前时间。结构utimbuf 定义如下:
1 | struct utimbuf |
返回值:执行成功则返回0,失败返回-1。
四、rename库函数
rename函数用于重命名文件或目录,相当于操作系统的mv命令,对程序员来说,在程序中极少重命名目录,但重命名文件是经常用到的功能。
包含头文件:
1 |
函数声明:
1 | int rename(const char *oldpath, const char *newpath); |
参数说明:
oldpath 文件或目录的原名。
newpath 文件或目录的新的名称。
返回值:0-成功,-1-失败。
五、remove库函数
remove函数用于删除文件或目录,相当于操作系统的rm命令。
包含头文件:
1 |
函数声明:
1 | int remove(const char *pathname); |
参数说明:
pathname 待删除的文件或目录名。
返回值:0-成功,-1-失败。
六、课后作业
1)继续丰富您的函数库,用mkdir创建目录的时候,例如mkdir(“/tmp/aaa/bbb/ccc”,0755);,如果上级目录不存在(/tmp/aaa或/tmp/aaa/bbb不存在),是无法创建/tmp/aaa/bbb/ccc目录的,这不是程序员想要的,我们要再写一个函数,如果上级目录不存在,就创建上级目录,一级一级的创建,函数的声明如下:
1 | int MKDIR(const char *pathname); |
2)编写一个获取文件时间的函数,声明如下:
1 | // 获取文件的时间,即modtime |
out_ModTime的格式是"yyyy-mm-dd hh24:mi:ss"。
3)编写一个获取文件大小的函数,声明如下:
1 | // 获取文件的大小,返回字节数 |
4)rename函数有一个不足,如果目标文件名目录newpath的上级目录不存在,函数返回失败,重写一个新的RENAME函数,如果newpath的上级目录不存在,先创建newpath的上级目录,再rename,函数的声明如下:
1 | int RENAME(const char *oldpath, const char *newpath); |
5)utime函数的第二个参数是一个结构体utimbuf,不方便使用,在实际开发中,我们更希望是一个字符串格式的时间,如:“2019-02-08 12:05:02”,重写一个utime函数,功能与utime相同,但是把第二个参数改为字符串格式的时间,函数的声明如下:
1 | int UTIME(const char *filename, const char *strtime); |
七、版权声明
C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道