2
#include <iostream>
#include <direct.h>
using namespace std;
int main() {
 if( _mkdir("d:\\a\\b") == 0 ){
   cout << "success";
 }    else if (  _mkdir("d:\\a") == EEXIST ) {
   cout << "Directory was not created because dirname is the name of an existing   file, directory, or device.";
      }
         else if (  _mkdir("d:\\a") == ENOENT ) {
      cout << "Path was not found.";
    }
}

在运行程序时,输出是意外的。(大多数时候它是失败的。我不知道原因)

有时我会看到成功。很多时候,如果我\\用单斜杠删除双斜杠,\则消息是成功的。这件事让我很生气。为什么会这样?backslashes有问题吗?

更新

在 Visual c++ 2010 速成版中,当我按CTRL+F5时,输出只是按任意键继续...

4

4 回答 4

6

双斜线是正确的。检查错误号以找出失败的原因:

如果创建了新目录,则这些函数中的每一个都返回值 0。发生错误时,该函数返回 –1 并按如下方式设置 errno:
EEXIST - 未创建目录,因为 dirname 是现有文件、目录或设备的名称。ENOENT - 找不到路径。

注意:

_mkdir 每次调用只能创建一个新目录,因此只有 dirname 的最后一个组件可以命名一个新目录。

可能的原因:

  • 您正在尝试使用相同的调用创建两者ab使用 egSHCreateDirectoryEx()代替)
  • 目录已经存在
于 2011-06-30T13:10:32.583 回答
4

您对失败在您的案例中的含义一直含糊不清。这可能与您尝试一次创建多个文件夹有关吗?

d:\a\b如果文件夹d:\a已经存在,您只能创建该文件夹。否则,您需要先创建d:\a,然后再创建d:\a\b.

这是我为正确创建任何深度的目录而编写的代码。

于 2011-06-30T13:10:05.697 回答
1

请注意,_mkdir 不返回 ENOENT 或 EEXIST,它们是errno调用 _mkdir 之后的值。如果 _mkdir 失败,它会根据文档返回 -1。

http://msdn.microsoft.com/en-us/library/2fkk4dzw(v=vs.80).aspx

于 2011-06-30T13:39:43.300 回答
0

我也收到了这个错误。在我的情况下_mkdir()实际上是返回13 : EACCESS。我不能确定为什么,但是将分隔符从 '\\' 更改为 '/' 实际上解决了我的问题。根据这个线程,行为mkdir()受平台控制,在我的情况下,我VC++2012在 Windows 7 上使用。

更新:问题不是分隔符。为了创建一个文件夹,我在检查结果时递归地尝试创建它的父级_mkdir()。要创建C:\1\2,我首先尝试创建C:不仅已存在,而且未授予创建它的权限。似乎在实际检查文件夹是否存在之前检查了创建文件夹的权限!这就是为什么我得到EACCESS.

于 2013-06-22T22:19:52.560 回答