1、前言
工作中涉及到文件系统,有时候需要判断文件和目录是否存在。我结合apue第四章文件和目录,总结一下如何正确判断文件和目录是否存在,方便以后查询。
2、stat系列函数
stat函数用来返回与文件有关的结构信息。stat系列函数有三种情况,分别对应文件名称、文件描述符和符号链接文件。stat结构描述了文件的属性,主要包括文件的类型、文件大小等等。详细stat结构如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
struct stat { mode_t st_mode; // file type & mode(permissions) ino_t st_ino; // i-node number(serial number) dev_t st_dev; // device number(filesystem) dev_t st_rdev; // device number for specials files nlink_t st_nlink; // number of links uid_t st_uid; // user id of owner gid_t st_gid; // group id of owner off_t st_size; // size in bytes, for regular files time_t st_atime; // time of last access time_t st_mtime; // time of last modification time_t st_ctime; // time of last file status change long st_blksize; // best i/o block size long st_blocks; // number of 512-byte blocks allocated }; |
我们可以通过stat获取文件的类型和文件大小等信息。文件类型有:普通文件、目录文件、块特殊文件、字符特殊文件、fifo、套接字和符号链接。要想通过stat系列函数来判断文件或者目录是否存在,当执行stat函数,如果文件存在时,还需进一步判断该文件是普通文件还是目录文件。
stat系列函数错误返回-1,错误码存在errno中,errno取值如下:
1
2
3
4
5
6
7
|
1、enoent 参数file_name 指定的文件不存在 2、enotdir 路径中的目录存在但却非真正的目录 3、eloop 欲打开的文件有过多符号连接问题, 上限为16 符号连接 4、efault 参数buf 为无效指针, 指向无法存在的内存空间 5、eaccess 存取文件时被拒绝 6、enomem 核心内存不足 7、enametoolong 参数file_name 的路径名称太长 |
3、access函数
access函数按照实际用户id和实际组进行访问权限测试。函数原型为:
1
2
|
#include < unistd.h > int access(const char *pathname, int mode); |
mode取值:
f_ok 测试文件是否存在
r_ok 测试读权限
w_ok 测试写权限
x_ok 测试执行权限
正确判断一个文件是否存在是用access函数,实现如下所示:
4、oepndir函数
opendir函数用来打开文件目录,成功返回指针,出错返回null。实现如下:
以上这篇linux下判断文件和目录是否存在的方法(总结)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。