`
forever8tf
  • 浏览: 98953 次
  • 性别: 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,但以我的性格,虽然经过测试,但此程序难免会漏洞百出滴!

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

 

分享到:
评论

相关推荐

    VC6.0下实现Linux下的mkdir功能(创建文件夹)

    总的来说,通过`&lt;direct.h&gt;`库中的`_mkdir`函数,开发者可以在VC6.0下实现类似Linux`mkdir`的功能,创建新的文件夹或目录。对于更复杂的文件系统操作,如权限控制和跨平台兼容性,可能需要考虑使用其他库,如Boost....

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

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

    Linux下C语言编程--文件的操作

    根据提供的信息,我们可以详细探讨 Linux 下 C 语言编程中关于文件操作的相关知识点。这包括文件的创建、读写、属性管理...通过对这些函数的理解和运用,可以有效地管理和控制文件资源,从而实现更复杂的应用程序功能。

    IEC61850开源代码libIEC61850

    libIEC61850则是一个开源的、基于C语言实现的库,它为开发者提供了一种方便的方式来实现IEC61850协议,从而在各种设备和系统之间进行数据交换。 一、IEC61850标准概述 1. 标准背景:随着电力系统的发展,变电站的...

    fit-gl

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

    Snort IDS入侵检测系统

    mkdir -p /usr/local/snort/rules //建立规则文件夹 cp /usr/src/rules/* /usr/local/snort/rules/ vim /usr/local/snort/rules/web-misc.rules //取消暂不支持的检测规则 mkdir -p /var/log/snort //建立日志...

    pure-ftp下载

    - 创建必要的目录:`mkdir -p /home/tools/pureftpd/etc` 和 `mkdir -p /home/tools/pureftpd/var/log/`。 - 复制配置文件到指定位置:使用`cp pure-config.pl /home/tools/pureftpd/etc/` 和 `cp pure-ftpd.conf ...

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

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

    基于S3C2410(ARM9)的Linux2.6.14.1系统全线移植文档

    第二阶段是C语言实现的功能。 - **3. u-boot的移植过程** - 介绍了移植环境的搭建,包括Makefile的修改、配置文件的创建等。 - 描述了具体的移植步骤,包括配置交叉编译工具等。 通过以上详细介绍,开发者可以...

    嵌入式linux中基础命令的学习笔记

    如果需要创建多层嵌套目录,可以使用`mkdir -p`,如`mkdir -p aa/bb/cc`。 文件管理方面,`ls`命令用来列出目录内容,`ls -a`显示所有文件包括隐藏文件,`ls -l`则提供详细信息,包括文件类型、权限、大小、时间和...

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

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

    Linux 常用命令大全

    - **说明**:`mkdir`用于创建单个目录,而`mkdir -p`则可以创建多级目录结构,即使其中某些目录层级已经存在也不会报错。 #### 3. `pwd` 命令 - **功能**:用于显示当前工作目录的完整路径。 - **用法**: ```bash...

    基于Jenkins的PHP自动构建

    sudo mkdir -p ${JENKINS_HOME}/workspace/NEW_TEST/__logs sudo touch /var/deploy/NEW_TEST/phing/build.xml sudo touch /var/deploy/NEW_TEST/phpdox/gen.xml ``` 通过以上步骤,我们可以成功搭建基于 Jenkins ...

    常用的unix命令集

    例如,`mkdir -p /tmp/a/b/c`会在`/tmp`目录下创建`a/b/c`的完整路径。 5. `rmdir`命令用于删除空目录。`-p`选项同时删除所有空的父目录,`-s`选项在遇到非空目录时静默失败。例如,`rmdir -p /tmp/a/b/c`如果`/tmp...

    unix 命令 详细

    用户可以通过键盘上的上下键来控制文件内容的滚动,也可以使用其他命令来实现更多的功能。 - **选项详解**: - `-c`: 清屏后重新显示文件内容。 - `-d`: 显示错误信息。 - `-f`: 强制使用全屏模式。 - `-l`: ...

    linux cp命令的实现

    它的功能强大且灵活,能够帮助用户轻松地备份数据、创建副本或者在不同的目录之间移动文件。下面我们将深入探讨`cp`命令的实现原理、选项以及实际应用。 `cp`命令的基本语法是: ```bash cp [选项] 源 目标 ``` ...

    mysql备份脚本

    在Windows环境下,我们可以使用批处理文件和Windows的任务计划程序来实现类似的功能。以下是一个Windows批处理文件的例子: ```batch @echo off set BACKUP_DIR=C:\path\to\your\backup\directory set MYSQL_USER=...

    软件培训笔记

    - `mkdir`:用于创建目录,`mkdir -p`可以在路径不存在时创建多级目录。 - `cp`:用于复制文件或目录,使用`-r`选项可以递归复制目录。 - `mv`:用于移动文件或目录,也可以用来重命名文件。 - `rm`:用于删除...

    操作系统课程设计新项目-基于C语言实现的文件系统源码+详细说明文档(含图形界面).zip

    操作系统课程设计新项目-基于C语言实现的文件系统源码+详细说明文档(含图形界面).zip 【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,...

Global site tag (gtag.js) - Google Analytics