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

三:实现

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

本文出自 “专注linux” 博客,请务必保留此出处http://forlinux.blog.51cto.com/8001278/1530287

linux C实现mkdir功能,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。