问题的引入
在项目中可能会遇见查询某个路径或者文件是否存在的情况,如果不存在就新建。在看代码的时候发现有人这样实现:
dir = opendir(g_logDir);
if ( dir == NULLP )
{
mkdir(g_logDir, O_RDWR);
}
else
{
closedir(dir);
}
对应文件的话会这样写
dir = fopen(g_logDir);
if ( dir == NULLP )
{
fwrite(g_logDir, O_RDWR);
}
else
{
fclose(g_logDir);
}
目的很简单,就是查询目录或者文件是否存在,不存在就新建。这样确实可行,但是很费解,做了那么多事情就为了新建个路径或者文件,有是 open 又是 close的,要查询有查询的函数啊,何必呢!
access函数
函数原型
int access(const char *filename, int mode);
头文件
#include <dirent.h>
参数说明
- filename:可以填写文件夹路径或者文件路径
- mode:0 (F_OK) 只判断是否存在
2 (R_OK) 判断写入权限
4 (W_OK) 判断读取权限
6 (X_OK) 判断执行权限
用于判断文件夹是否存在的时候,mode取0,判断文件是否存在的时候,mode可以取0、2、4、6。 若存在或者具有权限,返回值为0;不存在或者无权限,返回值为-1。
代码实现
#include<stdio.h>
#include<dirent.h>
#include<fcntl.h>
void main()
{
char g_logDir[] = "/tmp/test";
if ( access(g_logDir,0) != 0)
{
mkdir(g_logDir,0775 );
printf("hello,no dir.... \n");
}
else
{
printf("hello,yes dir.... \n");
}
}
代码解析
这里用access函数判断路径是否存在,不存在就建立,用到了mkdir函数,其参数有两个,第一个写路径字符串,第二个写创建的路径的权限,这里不要写成O_RDONLY 、 O_WRONLY 、 O_RDWR 、 O_CREAT,也不要写成775三位数,不然权限会出错!
#define O_ACCMODE 0003
#define O_RDONLY 00
#define O_WRONLY 01
#define O_RDWR 02
#define O_CREAT 0100 /* not fcntl */
#define O_EXCL 0200 /* not fcntl */
#define O_NOCTTY 0400 /* not fcntl */
#define O_TRUNC 01000 /* not fcntl */
#define O_APPEND 02000
#define O_NONBLOCK 04000
#define O_NDELAY O_NONBLOCK
#define O_SYNC 010000
#define O_FSYNC O_SYNC
#define O_ASYNC 020000