当前位置: 首页 > 面试题库 >

如何在C ++ / Linux中创建目录树?

淳于健
2023-03-14
问题内容

我想要一种简单的方法来在C ++ / Linux中创建多个目录。

例如,我想在目录中保存文件lola.file:

/tmp/a/b/c

但是如果目录不存在,我希望它们可以自动创建。一个可行的例子将是完美的。


问题答案:

这是一个可以用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 <errno.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif /* HAVE_UNISTD_H */
#include <string.h>
#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 <stdio.h>

/*
** 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(以上)之间的变化是对EEXISTin
的测试do_mkdir()。Switch指出了这一点-谢谢Switch。测试代码已经升级,并在MacBook Pro(2.3GHz Intel Core i7,运行Mac OS X10.7.4)上重现了该问题,并表明该问题已在修订版中修复(但测试只能显示存在的错误) ,从来没有他们缺席)。

(特此授权您出于归属将此代码用于任何目的。)



 类似资料:
  • 问题内容: 一切都在问题中。这是我的代码: 我正在用Android编写一个小型文件管理器,我想增加创建目录的可能性。没有异常,成功变量总是返回false。有人可以告诉我我的代码有什么问题吗? 谢谢你的建议!! [编辑] 顺便说一句,当手机处于开发模式时,应用程序是否对sdcard具有写访问权限?我正在用手机编程(Acer液体) 问题答案: 您必须添加此权限: 顺便说一下,不确定如何获取SDcard

  • 问题内容: 我想编写一个检查目录是否存在的程序;如果该目录不存在,那么它将在其中创建目录和一个日志文件,但是如果该目录已经存在,则它将在该文件夹中创建一个新的日志文件。 我如何在Linux中用C做到这一点? 问题答案: 看看检查,如果该目录存在, 和,创建目录。 您可以使用和命令查看这些功能的手册。

  • 问题内容: 如果要在中创建文件,可以执行以下操作: 另外,我想用于创建文件。那我该怎么办呢?由于某种原因,该文件未在正确的目录中创建。 问题答案: 最好的方法是:

  • 当使用嵌入式HSQLDB进行单元测试时,似乎无法正确处理hibernate实体映射文件中定义的模式和/或目录。hibernate映射如下所示: 我不能更改hibernate实体映射,我不想使用其他数据库引擎(我知道H2DB可以处理这个)。有人能说明如何使HSQLDB在这个单元测试上下文中工作吗?

  • 我是一个使用V13的情报人员。 我有一个简单的java项目(默认)结构,如下所示: 现在,我想编写一个简单的测试,并将代码放在/src/test/java目录中。所以我决定更改我的项目格式,使其看起来像: 创建该结构后,我显然希望将src中的当前类移到main/java/com...结构。 如果我在根目录中创建了一个新目录,我可以选择将目录标记为测试源根目录,但它仍然挂在根目录上,如下所示: 有人

  • 我正在制作一个目录来存储所有上传的文件在我的spring boot应用程序启动时。 此目录的路径存储在application.properties文件中。我正在尝试阅读这个路径,并在项目启动时创建一个目录。在启动时创建目录时,我无法获取路径。