在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/zh-hk/n/298182.html
微信掃一掃
支付寶掃一掃