这里有一个C函数可以用C编译器编译。

/*

@(#)File: $RCSfile: mkpath.c,v $

@(#)Version: $Revision: 1.13 $

@(#)Last changed: $Date: 2012/07/15 00:40:37 $

@(#)Purpose: Create all directories in path

@(#)Author: J Leffler

@(#)Copyright: (C) JLSS 1990-91,1997-98,2001,2005,2008,2012

*/

/*TABSTOP=4*/

#include "jlss.h"

#include "emalloc.h"

#include

#ifdef HAVE_UNISTD_H

#include

#endif /* HAVE_UNISTD_H */

#include

#include "sysstat.h" /* Fix up for Windows - inc mode_t */

typedef struct stat Stat;

#ifndef lint

/* Prevent over-aggressive optimizers from eliminating ID string */

const char jlss_id_mkpath_c[] = "@(#)$Id: mkpath.c,v 1.13 2012/07/15 00:40:37 jleffler Exp $";

#endif /* lint */

static int do_mkdir(const char *path, mode_t mode)

{

Stat st;

int status = 0;

if (stat(path, &st) != 0)

{

/* Directory does not exist. EEXIST for race condition */

if (mkdir(path, mode) != 0 && errno != EEXIST)

status = -1;

}

else if (!S_ISDIR(st.st_mode))

{

errno = ENOTDIR;

status = -1;

}

return(status);

}

/**

** mkpath - ensure all directories in path exist

** Algorithm takes the pessimistic view and works top-down to ensure

** each directory in path exists, rather than optimistically creating

** the last element and working backwards.

*/

int mkpath(const char *path, mode_t mode)

{

char *pp;

char *sp;

int status;

char *copypath = STRDUP(path);

status = 0;

pp = copypath;

while (status == 0 && (sp = strchr(pp, '/')) != 0)

{

if (sp != pp)

{

/* Neither root nor double slash in path */

*sp = '\0';

status = do_mkdir(copypath, mode);

*sp = '/';

}

pp = sp + 1;

}

if (status == 0)

status = do_mkdir(path, mode);

FREE(copypath);

return (status);

}

#ifdef TEST

#include

/*

** Stress test with parallel running of mkpath() function.

** Before the EEXIST test, code would fail.

** With the EEXIST test, code does not fail.

**

** Test shell script

** PREFIX=mkpath.$$

** NAME=./$PREFIX/sa/32/ad/13/23/13/12/13/sd/ds/ww/qq/ss/dd/zz/xx/dd/rr/ff/ff/ss/ss/ss/ss/ss/ss/ss/ss

** : ${MKPATH:=mkpath}

** ./$MKPATH $NAME &

** [...repeat a dozen times or so...]

** ./$MKPATH $NAME &

** wait

** rm -fr ./$PREFIX/

*/

int main(int argc, char **argv)

{

int i;

for (i = 1; i < argc; i++)

{

for (int j = 0; j < 20; j++)

{

if (fork() == 0)

{

int rc = mkpath(argv[i], 0777);

if (rc != 0)

fprintf(stderr, "%d: failed to create (%d: %s): %s\n",

(int)getpid(), errno, strerror(errno), argv[i]);

exit(rc == 0 ? EXIT_SUCCESS : EXIT_FAILURE);

}

}

int status;

int fail = 0;

while (wait(&status) != -1)

{

if (WEXITSTATUS(status) != 0)

fail = 1;

}

if (fail == 0)

printf("created: %s\n", argv[i]);

}

return(0);

}

#endif /* TEST */

宏STRDUP()和FREE()是错误检查版本的strdup()和free(),在emalloc.h中声明(并在emalloc.c和estrdup.c中实现)。 “sysstat.h”头处理< sys / stat.h>的破坏版本。并且可以被< sys / stat.h>在现代的Unix系统(但在1990年有很多问题)。和“jlss.h”声明mkpath()。

v1.12(上一个)和v1.13(上面)之间的更改是对do_mkdir()中的EEXIST的测试。这是指出必要的Switch – 谢谢你,Switch。测试代码已经升级,并在MacBook Pro(2.3GHz Intel Core i7,运行Mac OS X 10.7.4)上重现了这个问题,并建议问题在修订版本中是固定的(但测试只能显示错误的存在,从不缺席)。

(因此,您有权将此代码用于出于任何目的而使用归因。)

linux中创建目录树,如何在C/Linux中创建目录树?相关推荐

  1. linux卸载欧朋浏览器,如何在Ubuntu系统中安装和卸载Opera浏览器

    以下内容教您如何在Ubuntu操作系统中安装Opera浏览器. 通常,可以通过以下方法安装不同的Opera版本. 下面将向您展示如何在Ubuntu中安装Opera 55版本的浏览器. 如果不需要,则可 ...

  2. linux终端密码星星,如何在Ubuntu终端中显示密码星号

    每当要求您在Ubuntu终端中键入密码时,都将插入密码,而不会得到任何可视显示或屏幕反馈.在这种情况下,您可能会通过错误输入密码而弄乱密码.这就是视觉反馈如此重要的原因.它可以帮助您跟踪输入的字符数, ...

  3. linux kvm百度云,如何在 Ubuntu Linux 上使用 KVM 云镜像

    如何下载并使用运行在 Ubuntu Linux 服务器上的 KVM 云镜像?如何在 Ubuntu Linux 16.04 LTS 服务器上无需完整安装即可创建虚拟机?如何在 Ubuntu Linux ...

  4. 在html表格中进行计算,如何在word表格中实现计算功能?超级实用,值得细细品味...

    常听同事们说:word就是文字处理,excel就是制表计算.乍一听,也没什么不妥啊,但细细一想,这是对word很大的伤害. 今天得改改这种看法了,其实,word表格也有计算功能,例如:在财务报表.工资 ...

  5. lsdyna如何设置set中的node_list_如何在Matlab GUI中播放带声音的视频?

    各位同学好,各位知乎的小伙伴们大家好.今天,我要给大家分享的内容是:"如何在Matlab GUI中播放带声音的视频?" 这个问题有点奇怪,什么叫做带声音的视频?视频一般不都是带声音 ...

  6. linux中创建目录树,如何在C++/Linux中创建目录树?

    Jonathan Lef.. 58 这是一个可以用C++编译器编译的C函数. /* @(#)File: $RCSfile: mkpath.c,v $ @(#)Version: $Revision: 1 ...

  7. linux mint 安装内核,如何在Ubuntu, Linux Mint中安装Linux Kernel 4.18

    Linus Torvalds终于在12日下午宣布发布Linux Kernel 4.18. 他在lkml.org写道: 这是一个非常平静的一周,可以说我上周可以按时发布,但我们确实有一些小的更新. 主要 ...

  8. win10 linux分区大小调整大小,如何在windows系统中调整分区大小(包括windows10/8/7)...

    对磁盘进行分区(尤其是Windows 10,8和7)至关重要.毕竟,通过磁盘的分区,任务和其他程序的处理可以采用更有效的路线.分区可以更轻松地整理任务并专注于重要的事情. 分区磁盘时,第一次尝试时总是 ...

  9. linux gradle仓库位置,如何在Android Studio中使用Gradle发布项目至Jcenter仓库

    简述 目前非常流行将开源库上传至Jcenter仓库中,使用起来非常方便且易于维护,特别是在Android Studio环境中,只需几步配置就可以轻松实现上传和发布. Library的转换和引用 博主的 ...

最新文章

  1. 4-类和结构体和可选类型
  2. Python Selenium + phantomJS 模拟登陆教务管理系统 “抢课”
  3. stm32中断向量控制器
  4. linux shell zsh,Linux终极shell Z Shell 用强大的zsh oh-my-zsh把Bash换掉
  5. vue+element-ui操作删除(单行和批量删除)
  6. 多线程执行CPU过高问题
  7. jQuery插件备忘
  8. C语言里面的 malloc 函数
  9. IDE工具的[多行光标编辑模式]
  10. Qt QSsh 使用 windows Qt实现ssh客户端
  11. java 纯真ip 乱码_UTF-8使用纯真IP数据库乱码问题
  12. 拼多多总显示服务器冻僵,为什么拼多多商家后台会打不开?什么原因导致的?
  13. [技术讨论]关于前几天发布的京东bug上的问题分析
  14. SAP项目上的疑难杂症-(制品区分)如何处理?
  15. API 接口应该如何设计?如何保证安全?如何签名?如何防重?
  16. 可达性分析算法中根节点有哪些
  17. Tarjan算法超详细讲解(割点割边强连通)
  18. 线程之interrupt
  19. python学习笔记:插入函数append,extend与insert的使用与区别
  20. 2.石头游戏(坑爹)

热门文章

  1. python将非0数视为false_python 面试题
  2. oracle通过执行计划cost,Oracle 执行计划(5)—cost成本之索引范围扫描-B树索引
  3. php 打印错误 display,php错误display及error_reporting的使用
  4. ajax修改按钮的html值,表格行的按钮AJAX后,怎么修改表格当前行的值
  5. php获取随机图片,PHP 随机显示某张图片
  6. 放开那三国3服务器维护,放开那三国3新服铤而走险开服时间表_放开那三国3新区开服预告_第一手游网手游开服表...
  7. 图神经网络(一)图信号处理与图卷积神经网络(5)图卷积神经网络
  8. html dom对象常用事件,HTML Dom Event对象onkeydown事件
  9. 『设计模式』反射,反射程序员的快乐!为什么我老是加班?为什么我工资不如他多?原来是我不懂反射!
  10. C语言非常重要的细节(知道一点更新一点)