2011-06-30 317 views
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."; 
    } 
} 

在運行程序時,輸出是意外的。 (大多數時候它是失敗的,我不知道原因)故障排除_mkdir故障

有時我看到success.Many時候,我如果我刪除雙斜線\\單斜槓\消息是成功的。 這件事讓我非常憤怒。這是爲什麼發生? 是backslashes的問題?

UPDATE

在Visual C++ 2010 Express Edition的

當我按下CTRL + F5輸出僅按任意鍵繼續......

+2

當_mkdir失敗時,嘗試查看全局變量errno的值,它可能會給出原因。 – Serge

+0

不,你不能只測試'EEXIST'和'ENOENT'的返回值,你必須檢查'errno'。 –

+0

..那就是b'co​​z我試圖用相同的電話創建a和b –

回答

6

雙斜槓是正確的。檢查the error number以查明它失敗的原因:

如果新目錄已創建,則每個函數都會返回值0。出錯時,函數返回-1並設置errno,如下所示:
EEXIST - 由於dirname是現有文件,目錄或設備的名稱,因此未創建目錄。 ENOENT - 未找到路徑。

需要注意的是:

_mkdir可以爲每個電話只有一個新的目錄,所以只有目錄名的最後一個組件可以命名一個新的目錄。

可能的原因:

+0

[_mkdir,_wmkdir](http://msdn.microsoft.com/en-us/library/2fkk4dzw(v = vs 0.80)的.aspx) – crashmstr

4

你一直比較含糊什麼失敗意味着你的情況。它可能與您試圖一次創建多個文件夾的事實有關嗎?

如果d:\a已存在,則只能創建文件夾d:\a\b。否則,您需要先創建d:\a,然後創建d:\a\b

Here's the code I wrote正確地創建一個目錄到任何深度。

0

我收到此錯誤了。在我的情況下,_mkdir()實際上是返回13 : EACCESS。我無法確定爲什麼,但將分隔符從'\\'更改爲'/'實際上解決了我的問題。根據this threadmkdir()的行爲受平臺控制,在我的情況下,我在Windows 7上使用VC++2012

更新:問題不是分隔符。要創建一個文件夾,我遞歸地嘗試創建它的父母,同時檢查_mkdir()的結果。要創建C:\1\2我首先嚐試創建C:,它不僅已經存在,而且創建它的權限也不會被授予。似乎在實際檢查之前檢查是否存在創建文件夾的權限!這就是爲什麼我得到EACCESS