linux C實現mkdir功能

   

一:背景

    linux 中的mkdir命令是用來創建一個目錄的,相應的就需要使用到linux中的系統調用函數mkdir來實現目錄創建的功能。單單只是創建目錄的話一個系統調用足以,本文是使用mkdir函數來實現mkdir -p這個選項的功能,對其不存在的父目錄實現創建。


二:思路

    對於一個a/b/c這樣的一個多級目錄,要想實現父目錄的創建方法和思路有很多,可以進行字符串處理分出一級一級目錄來,但是這樣實現很是繁瑣,以至於我想到了遞歸實現。

思路如下:

    1.先判斷a/b/c是否存在,不存在獲取其父目錄判斷。若存在直接退出

    2.判斷a/b是否存在,不存在就獲取其父目錄,若存在退出

    3.判斷a/是否存在,不存在就獲取其父目錄,若存在退出

    4.如果其父目錄爲.或/時退出

思路大體如下。爲了實現以上過程,需要一個可以獲得一個目錄的父目錄的函數。果斷man。

最終定位到dirname函數非常符合我的要求。函數聲明如下:

#include <libgen.h>
char *dirname(char *path);

三:實現

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <libgen.h>
#include <string.h>

#define MAXSIZE 100
void Createdir(char *);
int main(int argc,char *argv[])
{
#判斷參數
        if(argc <= 1){

                printf("mkdir:Usage:dirstr\n");
                exit(1);
        }
#遍歷參數,對每個參數進行操作
        while(--argc){
                argv++;
                Createdir(*argv);
        }
}

void Createdir(char *path)
{
        char data[MAXSIZE];
         #判斷是否是當前目錄或/目錄
        if((strcmp(path,".") == 0) || (strcmp(path,"/")==0))
                return;
         #判斷目錄是否存在
        if(access(path,F_OK) == 0)
                return;
        else{
        #保存目錄
                strcpy(data,path);
        #獲取目錄的父目錄
                dirname(path);
        #遞歸執行
                Createdir(path);
        }
        #創建目錄
        if(mkdir(data,777) == -1){
                perror("mkdir error");
                exit(1);
         }
        return;
}

四:總結

    在寫mkdir -p這個功能的時候,思路很明確,代碼也基本上早就寫好了,但是調試花了很長時間。究其原因是在於dirname這個函數,看其聲明很明顯就是給一個目錄的path字符串指針,返回一個指向其目錄的字符串指針,但是其實不然。dirname不僅返回一個指向其父目錄的字符串指針還可能修改傳入的參數path的值爲父目錄字符串。man文檔中說明如下:

The  dirname()  function  may  modify  the string pointed to by path, and may return a
 pointer to static storage that may then be overwritten by subsequent calls to dirname().
最終還是通過printf打印調試的,沒有藉助gdb,主要還是這傢伙用起來不舒服。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章