Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / 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 100void Createdir(char *);int main(int argc,char *argv[]){#判断参数        if(argc <= 1){                 printf("mkdir:Usage:dirstr ");                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 apointer to static storage that may then be overwritten by subsequent calls to dirname().最终还是通过printf打印调试的,没有借助gdb,主要还是这家伙用起来不舒服。本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-07/104738.htm