故障排除_mkdir故障

troubleshooting _mkdir failure

本文关键字:故障 mkdir 排除      更新时间:2023-10-16
#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时,输出仅为按任意键继续

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

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

注意:

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

可能的原因:

  • 您正在尝试使用同一调用创建ab(例如使用SHCreateDirectoryEx()(
  • 目录已存在

您对失败在您的案例中意味着什么一直很模糊。这可能与您试图同时创建多个文件夹有关吗?

只有在d:a已经存在的情况下,才能创建文件夹d:ab。否则,您需要先创建d:a,然后再创建d:ab

以下是我为正确创建任意深度的目录而编写的代码。

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

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

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

更新:问题不在于分隔符。为了创建一个文件夹,我递归地尝试创建它的父文件夹,同时检查_mkdir()的结果。为了创建C:12,我首先尝试创建C:,它不仅已经存在,而且创建它的权限也没有被授予。似乎创建文件夹的权限是在实际检查之前检查的,如果它存在!这就是我得到EACCESS的原因。