linux C實現mkdir功能

來源:互聯網
上載者:User

標籤:linux   c   

   

一:背景

    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 100void 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,主要還是這傢伙用起來不舒服。

本文出自 “專註linux” 部落格,請務必保留此出處http://forlinux.blog.51cto.com/8001278/1530287

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.