歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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);

------------------------------分割線------------------------------

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm

讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm

將C語言梳理一下,分布在以下10個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題

三:實現


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

Copyright © Linux教程網 All Rights Reserved