創建多層目錄的函數實現

在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-tw/n/298182.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-28 12:17
下一篇 2024-12-28 12:17

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Rclone複製所有目錄

    如果你需要將本地文件複製到雲端,或者從雲端複製文件到本地,Rclone是一個非常好的選擇。本文將介紹如何使用Rclone複製所有目錄。 一、安裝Rclone 首先,你需要在你的機器…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29

發表回復

登錄後才能評論