排除_mkdir故障

时间:2011-06-30 13:04:39

标签: c++ visual-c++ visual-c++-2010-express

#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 express版中,当我按 CTRL + F5 时,输出仅按任意键继续......

4 个答案:

答案 0 :(得分:6)

双斜线是正确的。检查the error number以找出失败的原因:

  

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

请注意:

  

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

可能的原因:

答案 1 :(得分:4)

你对失败在你的情况下意味着什么一直很模糊。是否与您尝试一次创建多个文件夹的事实有关?

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

Here's the code I wrote正确创建任意深度的目录。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我也收到了这个错误。就我而言,_mkdir()实际上正在返回13 : EACCESS。我无法确定为什么,但是将分隔符从'\\'更改为'/'实际上解决了我的问题。根据{{​​3}},mkdir()的行为由平台管理,在我的情况下,我在Windows 7上使用VC++2012

更新:问题不是分隔符。要创建文件夹,我会在检查_mkdir()的结果时递归尝试创建其父项。要创建C:\1\2,我首先尝试创建不仅已存在的C:,而且还授予创建它的权限。似乎在实际检查之前检查创建文件夹的权限是否存在!这就是我得到EACCESS的原因。