`
forever8tf
  • 浏览: 96683 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

C实现mkdir -p 功能

    博客分类:
  • Time
阅读更多

一直打不起精神,直到前几个月开始时间emacs 和 vim,两款在神左右相伴的编辑器,很强大,很舒服,相见恨晚。

程序是小程序,是《Understanding Unix/Linux Programming - A Guide to Theory and Practice》这本书中4.15的习题。题目是这样的:

Unix 命令 mkdir 接受选项 -p。编写一种支持这个选项的 mkdir 命令版本

题目不是很难,查看 man mkdir 可知如下:

-p, --parents
              no error if existing, make parent directories as needed

 好,根据功能描述开始实现吧~代码如下:

/*
 * =====================================================================================
 *
 *       Filename:  mkdir.c
 *
 *    Description:  mkdir 
 *
 *        Version:  1.0
 *        Created:  2012年09月02日 16时11分17秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Guotf(), tfguo369@gmail.com
 *   Organization:  
 *
 * =====================================================================================
 */

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include "debug.h"
#include "error.h"

#define DIR_MODE 0777
#define ARRAY_LENGTH 1000


int checkPath(char *, char *);
int is_dir_exist(char *);
void deal_dir(char *);

/*
   checkPath 这个函数写的不好,循坏的控制很差,希望大牛指正批评。
 */
int checkPath(char *path, char *spath){
	memset(path, 0, ARRAY_LENGTH);
	int i = 0;
	char c;
	char *originp = spath;

#ifdef DEBUG
	printf("av[1] is %s\n", spath);
#endif
	while(c)
	{
#ifdef DEBUG
		printf("c is %c  , ", c);
		printf("i is %d\n", i);
#endif
#ifdef DEBUG
		printf("*spath is %c.(out)\n", *spath);
#endif
		while((c = *spath++) != '/' && c != '\0'){
			i++;
		}
		if(i == 0){
			if(!is_dir_exist("/")){
				deal_dir("/");
			}
		}
		else{
			memcpy(path, originp, i);
#ifdef DEBUG
			printf("debug %s\n", path);
#endif
			deal_dir(path);
		}
			i++;
	}
}

int is_dir_exist(char *name){
	DIR *d = opendir(name);
	return d == NULL ? 0 : 1;
}

void deal_dir(char *name){
#ifdef DEBUG
			printf("debug %s\n", name);
#endif
	if(!is_dir_exist(name)){
		if(mkdir(name, DIR_MODE) == -1){
			perror("Error");
			exit(1);
		}
	}
}

int main(int ac, char *av[]){
	char path[ARRAY_LENGTH];
	if(ac != 2){
		error(stderr, "dir is invalid.");
	}
	else{
		checkPath(path, av[1]);
	}
}

 目前测试没有bug,但以我的性格,虽然经过测试,但此程序难免会漏洞百出滴!

好了,给自己打打气,明天继续埋头~

 

分享到:
评论

相关推荐

    操作系统课设-基于C语言实现调度算法以及多进程模拟和测试源码+项目说明.zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习...mkdir -p build make ./main make clean ```

    fit-gl

    基于Qt的演示项目,以演示如何使用和实现基本的3D图形功能。 没有优化。 仅用于教育目的。 目的 学生提交是此存储库的主要目标。 不要在生产中使用此代码!!! 要求 git ; 与C ++ 17兼容的编译器; CMake 3.10+ ;...

    一个易于使用的组件,用于构建用C ++编写的功能强大的控制台应用程序-C/C++开发

    控制台组件预览安装用法构建目标动机贡献预览安装:创建项目:用法:安装最简单的安装方法是使用vscode扩展名:Marketplace存储库另外,也可以通过一些手动步骤来实现:首先,让我们下载CPM脚本mkdir -p cmake && ...

    docker-build:Docker构建的基础

    码头工人基地 Docker映像的基本构建脚本 此存储库包含具有用于docker构建自动化的全部功能的脚本,以及用于自定义部署步骤的示例实现... mkdir -p docker-myproject/src git clone https://github.com/anchor/docker-ba

    Linux关机时执行指定脚本功能实现

    1.关机时执行某个脚本的具体思路 (1)在文件夹/etc/init.d/下创建关机时需要执行的脚本file_name; (2)分别在文件夹/etc/rc0.d/和/etc/rc6.d/下创建该该脚本文件的链接文件K07file_name: ...sudo mkdir -p /var/lo

    基于NMPC的无人艇定点控制与轨迹跟踪控制仿真C++源码+项目使用说明.zip

    【资源说明】 基于NMPC的无人艇定点控制与轨迹跟踪控制仿真C++源码+...3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    入门学习Linux常用必会60个命令实例详解doc/txt

    虚拟控制台的切换可以通过按下Alt键和一个功能键来实现,通常使用F1-F6 。 例如,用户登录后,按一下“Alt+ F2”键,用户就可以看到上面出现的“login:”提示符,说明用户看到了第二个虚拟控制台。然后只需按“Alt+...

    windows实用dos命令大全

    1.功能:创建新的子目录  2.类型:内部命令  3.格式:MD[盘符:][路径名]〈子目录名〉  4.使用说明:  (1)“盘符”:指定要建立子目录的磁盘驱动器字母,若省略,则为当前驱动器;  (2)“路径名”:要...

    Linux操作系统基础教程

    要的是,Linux 上有公认的 C 语言世界最好的编译器 gcc,如果你想得到一个效率更高的开 发环境(并不一定是最友好的,但一定是最强大的),我建议你一定要好好的熟悉一下 Linux。 三.如何得到Linux? 据我所知...

    iuhyiuhkjh908u0980

    logo 设计不会,就这样先凑合了写道 Fuseblog预备开发带在线SHOP功能的个人博客系统.仿照Appfuse 提供一个完全自动化的ant构建脚本.在线SHOP的数据库建模图例已经 在博客中贴出.感兴趣的和我一起搭建,嘻嘻 文档博客...

    office在线查看

    一、 功能所需工具 下载工具 OpenOffice http://zh.openoffice.org/new/zh_cn/downloads.html JodConverter http://dldx.csdn.net/fd.php?i=992314146801277&s=08dbee95a6e2dda1a95aa8cbf4df197b Swftools(pdf2swf) ...

Global site tag (gtag.js) - Google Analytics