设为首页 加入收藏

TOP

Linux C实现mkdir功能
2014-11-23 22:06:53 来源: 作者: 【 】 浏览:13
Tags:Linux 实现 mkdir 功能

一:背景


Linux 中的mkdir命令是用来创建一个目录的,相应的就需要使用到linux中的系统调用函数mkdir来实现目录创建的功能。单单只是创建目录的话一个系统调用足以,本文是使用mkdir函数来实现mkdir -p这个选项的功能,对其不存在的父目录实现创建。


二:思路


对于一个a/b/c这样的一个多级目录,要想实现父目录的创建方法和思路有很多,可以进行字符串处理分出一级一级目录来,但是这样实现很是繁琐,以至于我想到了递归实现。


思路如下:


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


2.判断a/b是否存在,不存在就获取其父目录,若存在退出


3.判断a/是否存在,不存在就获取其父目录,若存在退出


4.如果其父目录为.或/时退出


思路大体如下。为了实现以上过程,需要一个可以获得一个目录的父目录的函数。果断man。


最终定位到dirname函数非常符合我的要求。函数声明如下:


#include


char *dirname(char *path);


------------------------------分割线------------------------------


C语言梳理一下,分布在以下10个章节中:


三:实现



#include


#include


#include


#include


#include


#include


#include



#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,主要还是这家伙用起来不舒服。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言可执行文件的内存结构 下一篇Flask-mail扩展的基本使用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: