这里有一个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. 如何画出优秀的架构图?
  2. 火爆全网!《算法刷题宝典》资源,免费下载!(含代码数据)
  3. python类中方法的执行顺序-Python实例化class的执行顺序实例方法
  4. 杭电2502--月之数
  5. python-迭代器
  6. 干货,记一次解决录音杂音问题
  7. 自然语言处理系列篇——关键词智能提取
  8. Linux的实际操作:文件目录类的实用指令(rm mv)
  9. urllib.error.HTTPError: HTTP Error 403: Forbidden
  10. Win7电脑开启局域网连接和共享过程中出现的您可能没有权限使用网络资源的解决办法...
  11. 利用Rsyslog向ElasticSearch推送nginx access日志
  12. blogspot博客搬家
  13. 为什么DDOS攻击是服务器的最大危害?
  14. SAP Exchange Rate 外币汇率的设置
  15. 【网络】SNAT和DNAT
  16. style-loader和css-loader
  17. 11-液晶显示器主要看什么参数?电脑显示器各项参数的含义科普大全
  18. 计算机照片误删除还能恢复,删除的相片可以恢复吗_电脑误删的照片怎么恢复...
  19. 基于python下django框架 实现校园网站系统详细设计
  20. 服务器发微信朋友圈长视频,微信朋友圈过长的视频怎么发 发布长视频技巧

热门文章

  1. linux 软件包管理设置,Linux速通08 网络原理及基础设置、软件包管理
  2. android 使用adb远程调试
  3. mysql文件说明_MySQL进阶之配置文件说明
  4. 实验7-3-7 字符转换 (15分)
  5. python跳转到新页面、如何等待页面加载完_python urllib2 – 在抓取之前等待页面完成加载/重定向?...
  6. 我也不知道该咋分类--莫队算法
  7. 要市场导向,不要销售导向,更不要个人导向(转)
  8. 建立主键应该遵循的原则
  9. C#中的is、as及转换
  10. 【知识蒸馏】ICCV21_Channel-wise Knowledge Distillation for Dense Prediction