在Linux系统中,我们经常需要创建多层嵌套的目录,如果手动创建,可能需要一个一个地输入目录名,并且很容易出现输错的情况。因此,编写一个可以一次性创建多层目录的函数,可以提高我们的工作效率。
一、函数说明
以下是一个可以创建多层目录的函数:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int create_dir(const char *dir)
{
int ret;
int i;
int len;
len = strlen(dir);
if(len > 512) {
printf("Directory path is too long.\n");
return -1;
}
char dir_name[512] = {0};
strncpy(dir_name, dir, len);
for (i = 0; i < len; i++) {
if (dir_name[i] == '/') {
dir_name[i] = '\0';
ret = access(dir_name, F_OK);
if (ret != 0) {
ret = mkdir(dir_name, 0755);
if (ret != 0) {
printf("mkdir(%s) failed: %s\n", dir_name, strerror(errno));
return -1;
}
}
dir_name[i] = '/';
}
}
ret = mkdir(dir_name, 0755);
if (ret != 0) {
printf("mkdir(%s) failed: %s\n", dir_name, strerror(errno));
return -1;
}
return 0;
}
该函数通过依次判断目录是否存在来创建多层嵌套的目录。具体来说,它根据输入的目录路径字符串,依次获取每个目录名,并对每个目录名进行以下操作:
– access函数检查该目录是否已经存在;
– 如果目录不存在,使用mkdir函数创建该目录,并给定权限为0755。
二、函数使用方法
以下是使用该函数创建多层目录的例子:
#include <stdio.h>
int main()
{
int ret;
ret = create_dir("/test/dir1/dir2/dir3");
if (ret != 0) {
printf("Failed to create directory.\n");
return -1;
}
return 0;
}
在该例子中,我们调用create_dir函数创建/test/dir1/dir2/dir3目录。如果函数返回0,则表示创建成功。
三、函数优化
上面的函数已经可以实现创建多层目录的功能,但是在实际使用中可能存在一些问题:
– 如果途中的某个目录不存在,那么该函数会失败并返回错误码。这样会给用户带来困扰,因为很难判断到底是哪个目录不存在。
– 如果某个目录已经存在,那么函数会继续调用mkdir函数创建该目录,这样可能浪费了一些时间。
为了优化这些问题,我们可以考虑使用递归来实现创建目录。以下是优化后的代码:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int create_dir(const char *dir)
{
int ret;
char tmp[512];
int i, len;
snprintf(tmp, sizeof(tmp), "%s", dir);
len = strlen(tmp);
if(tmp[len-1] == '/') {
tmp[len-1] = 0;
}
for(i = 1; i < len; i++) {
if(tmp[i] == '/') {
tmp[i] = 0;
ret = access(tmp, F_OK);
if(ret != 0) {
ret = mkdir(tmp, 0755);
if(ret != 0) {
printf("mkdir(%s) failed: %s\n", tmp, strerror(errno));
return -1;
}
}
tmp[i] = '/';
}
}
ret = mkdir(tmp, 0755);
if(ret != 0) {
printf("mkdir(%s) failed: %s\n", tmp, strerror(errno));
return -1;
}
return 0;
}
int create_dir_r(const char *path)
{
char dir[512];
struct stat st;
int len, i, j;
len = strlen(path);
if (len >= sizeof(dir)) {
printf("Path too long.\n");
return -1;
}
for (i = 1; i <= len; i++) {
memcpy(dir, path, i);
dir[i] = 0;
if (dir[i-1] == '/') {
dir[i-1] = 0;
}
if (stat(dir, &st) == -1) {
if (mkdir(dir, 0755) == -1) {
printf("mkdir(%s) failed: %s\n", dir, strerror(errno));
return -1;
}
} else {
if (!S_ISDIR(st.st_mode)) {
printf("File(%s) exists.\n", dir);
return -1;
}
}
}
return 0;
}
在优化后的create_dir_r函数中,我们使用了递归的方式依次创建目录,并且优化了错误判断和目录已存在的问题。在调用该函数时,只需要传入目录路径即可。
四、总结
通过编写一个可以创建多层目录的函数,我们可以提高Linux系统管理工作的效率。同时,在实现这个函数的过程中,我们也可以学习到一些Linux系统相关的函数和使用方法。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/298182.html
微信扫一扫
支付宝扫一扫