在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