【问题标题】:Can't find mkdir() function in dirent.h for windows在 windows 的 dirent.h 中找不到 mkdir() 函数
【发布时间】:2014-06-19 02:50:08
【问题描述】:

我在 VC2013 中为 windows 使用 dirent.h 1.20 (source)。

我在里面找不到mkdir()

我应该如何使用它?或者我可以仅使用dirent.h 以某种方式创建目录吗?

【问题讨论】:

  • mkdir 不应该住在<dirent.h>。在 POSIX 系统上,您可以从 <sys/types.h><sys/stat.h> 获得它(是的,您需要两者)。
  • 如果你可以选择 boost:它有一个 file system library,它以便携的方式提供相同的功能。
  • 你有 _mkdir 作为 C 库的一部分。因此,除非您需要其他库中的其他内容,否则您不需要它来创建目录 (#include <direct.h>)。

标签: c++ c visual-c++ mkdir dirent.h


【解决方案1】:

在不使用任何其他库的情况下提供帮助的最简单方法是。

#if defined _MSC_VER
#include <direct.h>
#elif defined __GNUC__
#include <sys/types.h>
#include <sys/stat.h>
#endif

void createDir(string dir) {
#if defined _MSC_VER
    _mkdir(dir.data());
#elif defined __GNUC__
    mkdir(dir.data(), 0777);
#endif
}

【讨论】:

    【解决方案2】:

    更新:自 C++17 以来,&lt;filesystem&gt; 是可移植的方式。对于早期的编译器,请查看Boost.Filesystem


    您链接到的标头有效地将您的(POSIX)dirent.h 调用转换为(本机)Windows 调用。但是dirent.h 是关于directory entries,即读取目录,而不是创建目录。

    如果您想创建一个目录 (mkdir()),您需要:

    • 类似的包装标头将您的 (POSIX) mkdir() 调用转换为相应的(本机)Windows 函数调用(我无法为您指出这样的标头),或者
    • 直接使用Windows API,这可能很实用,但会导致 POSIX 和 Windows 函数的混合非常丑陋...

    // UGLY - these two don't belong in the same source...
    #include <dirent.h>
    #include <windows.h>
    
    // ...
    CreateDirectory( "D:\\TestDir", NULL );
    // ...
    

    另一个解决方案是查看Cygwin,它提供了在 Windows 上运行的 POSIX 环境,包括 Bash shell、GCC 编译器工具链,以及完整的 POSIX 标头集合,如dirent.hsys/stat.h、@ 987654333@ 等,让您在编程中始终如一地使用 POSIX API。

    【讨论】:

      【解决方案3】:

      Visual Studio 包含 &lt;direct.h&gt; 标头。 该头文件声明了_mkdir and _wmkdir,可用于创建目录,并且是Visual Studio 中包含的C 库的一部分。

      另一个“简单”选项是使用 Windows API 调用,如 DevSolar 所示。

      【讨论】:

        【解决方案4】:

        您可以使用sys/types.h头文件并使用
        mkdir(const char*)方法创建目录
        以下是示例代码

        #include<stdio.h>
        #include<string.h>
        #include <unistd.h>
        #include<sys/stat.h>
        #include<sys/types.h>
        int main()
        {
            if(!mkdir("C:mydir"))
            {
                printf("File created\n");
            }
            else
                printf("Error\n");
        }
        
        【解决方案5】:

        mkdir 已弃用。将#include &lt;direct.h&gt; 作为头文件。然后写

        _mkdir("C:/folder")
        

        【讨论】:

          猜你喜欢
          • 2016-12-25
          • 2012-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-01
          • 1970-01-01
          • 2016-06-10
          • 1970-01-01
          相关资源
          最近更新 更多