linux API 判断目录是否存在

本文介绍如何在C++中通过系统API完成目录创建及权限设置,包括检查目录是否存在、创建目录、设置目录权限,并通过stat函数判断对象类型。详细解释了使用mkdir、stat、chmod等Linux API的方法,以及它们在目录操作中的应用。
部署运行你感兴趣的模型镜像

//create folder

struct stat statbuf;
if ( 0 != stat("./myfolder",&statbuf))   //If failed to get the status of this directory
{
     if (ENOENT == errno) //If folder  not exist
     {
           if (-1 == mkdir("./myfolder",S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH|S_IXOTH)) {    -------------注意这里设置的mode并不是最终myfolder的mode,他是mode与系统umask计算后的值,即是个不确定的值。所以我们在创建完目录后通过api chmod再来设置一下目录的权限
                            cout << "Failed to create folder in current directory." << endl;
                    }
           if (-1 == chmod("./myfolder",S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH|S_IXOTH)) {-----------------注意,API中mode不能用类似777这样的值,必须用S_IRUSR这种系统定义的常量。
                            cout << errno << endl;
                    }
     }
     else
     {
         cout << "Failed to create  folder myfolder in current directory." << endl; 
     }

 

另外可以通过stat获取状态后判断一个对象是否为目录或是文件

 if(S_ISDIR(buf.st_mode))  //check whether its directory
 {
      ptr = "directory";
 }

S_ISDIR 只是一个 macro 而已,buf.st_mode 和特定的mask 进行 & 运算,判断结果是否为特定的值。

 

c++并不提供这种对目录的操作,但是linux的API是支持的。通过 man 2 mkdir即可查看API的详细说明。

man帮助分为好几章,第一章为command,默认man查询时为man 1,即查询命令;

第二章为system calls,即系统调用,即我们通常所说的系统的API;

第三章为library functions,即c语言等的库函数。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

在C语言中判断一个目录是否存在,通常可以使用标准库函数`access()`或POSIX提供的`stat()`系统调用。下面是这两种方法的具体介绍: ### 使用 `access()` `access()` 函数主要用于检查文件或目录的存取权限,但它也可以用来检测文件或目录是否真的存在。它接受两个参数:第一个是要测试的路径字符串;第二个是一个整数常量,表示我们要进行的操作类型(如读、写)。这里我们可以传递F_OK来仅仅验证目标位置是否有东西。 #### 示例代码片段 - access(): ```c #include <unistd.h> #include <stdio.h> int main(void){ const char *dirPath = "./testDir"; // 指定你想检验的目录路径 if (access(dirPath, F_OK) == 0){ printf("目录 %s 存在\n", dirPath); } else { perror("无法访问"); // 如果失败,则输出具体的错误信息 } return 0; } ``` 注意:尽管`access()` 可以告诉我们文件/目录是否存在以及我们能否对其做某种操作,但对于区分文件还是目录的帮助不大。 ### 使用 `stat()` 相比于`access()` , 更推荐使用`stat()` 。因为除了能够确认对象的存在之外,还能通过返回的信息进一步确定它是普通文件还是特殊类型的节点(包括但不限于符号链接和块设备),特别是目录(`S_IFDIR`)。 #### 示例代码片段 - stat(): ```c #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> void check_directory(const char* path){ struct stat info; /* 获取状态 */ if(stat(path,&info)!=0){ fprintf(stderr,"无法获得 '%s' 的信息: ",path); perror(""); exit(EXIT_FAILURE); } /* 判断是不是目录 */ if(S_ISDIR(info.st_mode)){ printf("'%s' 是个存在目录。\n",path); }else{ printf("'%s' 不是个有效的目录。\n",path); } } int main(){ const char *dirPath = "/tmp"; check_directory(dirPath); return 0; } ``` 以上两段程序展示了如何分别采用`access()` 和 `stat()` 来探测目录的状态。前者简单明了但缺乏详细分类能力;后者则更为全面准确,并且适用于更多场合下的需求分析。 ### 注意事项: - **跨平台兼容性**:上述例子主要是基于 Unix/Linux 系统设计,在 Windows 平台上需替换相应 API ,比如 `_access_s()` 或者 WinAPI 中的相关功能。 - **权限限制**: 当前用户的执行上下文应当有足够的特权来进行这些查询动作,否则可能会遇到权限拒绝的问题。 - **竞态条件风险(Race Condition)** :即先检查再创建的方式可能导致竞争问题——即便发现不存在,但在真正去建立之前这段时间内却突然冒了出来! 综上所述,对于想要精确获知某条路径背后实体性质的情况,建议优先选用`stat()` 方案,因为它不仅能告诉你那里有没有这么个东⻄,还可以让你清楚了解到它的身份特征是什么样的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值