代码之家  ›  专栏  ›  技术社区  ›  foobarfuzzbizz

在C中,即使目录不存在,我如何从文件路径创建文件?

  •  1
  • foobarfuzzbizz  · 技术社区  · 14 年前

    我正在从用户处获取文件路径。然后我需要访问那个文件,如果它不存在,就创建它。如果中间目录不存在,我还需要创建它们。

    例如,如果我的目录如下:

    mydir
    |
    +---subdir
    |   |
    |   +-- FileA
    |
    +---File1
    

    我可能会收到mydir/subdir/filea,然后访问相关文件。但是,我也可能收到mydir/newdir/fileb。

    如何使用C语言中的Unix系统调用来实现这一点?我尝试使用open()和(o_rdwr_o_creat)标志,但没有成功。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Arun    14 年前

    如果允许您使用它,可以将OS调用包装在 system() 打电话。例如,用于列出文件 system( "ls" );

    要创建包含中间目录的目录,请使用 mkdir 具有 -p

    mkdir -p mydir/NewDir/
    

    (阿法克,如果newdir已经存在的话,这不会有什么伤害。)

    要创建空文件,请使用 touch

    touch mydir/NewDir/FileB
    

    改善效果追踪 :我编写了这个概念验证程序,并在Cygwin中进行了测试。

    #include <stdlib.h>
    #include <string.h>
    
    int main() {
    
        char const * dir = "dir/subdir";
        char const * file = "file";
    
        char mkdirCmd[ 80 ] = { 0 };
        strcat( mkdirCmd, "mkdir -p " );
        strcat( mkdirCmd, dir );
    
        char touchCmd[ 80 ] = { 0 };
        strcat( touchCmd, "touch " );
        strcat( touchCmd, dir );
        strcat( touchCmd, "/" );
        strcat( touchCmd, file );
    
        system( mkdirCmd );
        system( touchCmd );
    
        return 0;
    }
    

    单元测试:

    $ ls
    mkdir.c  mkdir.exe*
    
    $ ./mkdir.exe 
    
    $ ls
    dir/  mkdir.c  mkdir.exe*
    
    $ ls -R dir
    dir:
    subdir/
    
    dir/subdir:
    file
    
        2
  •  3
  •   Community CDub    8 年前

    我认为这个答案涵盖了你的问题:

    Recursive mkdir() system call on Unix

    简而言之,您必须自己创建子目录。

        3
  •  0
  •   theReverseFlick    14 年前

    不幸的是,没有递归的“makedir”,所以我担心你可能不得不自己做。

    但我觉得做起来很容易

    函数递归创建(filepath) 用斜线分割文件路径 如果最后一部分创建文件 否则创建目录 结束

    现在您有了自己的函数:)使用它会比使用某个Unix定义的函数更快乐:)

        4
  •  0
  •   Tim Post Samir J M Araujo    14 年前

    当我为 HelenOS 我必须实现许多标准的核心实用程序内置命令,如cd、mkdir、cat、touch等。

    这里是 my implementation of mkdir (您只需要一个函数),您可以像现在一样使用它(BSD许可)。

    它首先检查父目录是否存在,如果不存在,则标记所需路径并创建所有父目录。在大多数情况下,这是你唯一的选择。

    免责声明,我在一个月内编写了整个shell,它很快就需要对更重要的事情进行交互式测试,例如动态加载、调试以及与各种文件系统驱动程序的交互。