在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