linux下C语言mkdir,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

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

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值