2015-12-02 148 views
1

我不明白爲什麼創建目錄後mkdir返回不同的值。在這個例子中,我試圖讓一個目錄如果不是這樣的錯誤處理如果不是這樣的錯誤句柄否則去這個目錄在C中錯誤處理mkdir和chdir?

但它不工作,因爲我想! 它顯示我'創建失敗',但實際上創建了該目錄。 如果我讀取引用權,它會在成功時返回0。

代碼:

char* dirName = "Output"; 
    FILE *output; 

    if(!mkdir(dirName)) 
     if(chdir(dirName)) 
      printf("Permission to open a new directory is denied"); 
    else 
     printf("Permission to create a new directory is denied"); 

回答

1

由John Carpenter正確診斷,else涉及第二個if。使用大括號來避免這個被稱爲懸而未決問題的bug。

。在你的代碼中的另一個問題:Linux或BSD下,原型爲mkdir是:

#include <sys/stat.h> 
#include <sys/types.h> 

int mkdir(const char *path, mode_t mode); 

你包括系統頭文件?

未通過適當的權限,例如0777調用未定義的行爲,系統調用包裝器將傳遞不確定的權限,從而創建具有不一致權限的目錄。

這裏是一個修正版本:

const char *dirName = "Output"; 

if (!mkdir(dirName, 0777)) { 
    if (chdir(dirName)) { 
     printf("Permission to open a new directory is denied"); 
    } 
} else { 
    printf("Permission to create a new directory is denied"); 
} 
2

根據the documentation of mkdir

成功完成後,MKDIR()將返回0。否則,-1,應當歸還,沒有目錄應當建立,和errno應設置爲指示錯誤。現在

,請記住,在C 0計算爲false,非零結果爲true。因此,當您檢查if(mkdir(...))時,您實質上是在詢問mkdir是否返回非零值。 -1是非零的,所以你問的是mkdir()是否失敗,而不是mkdir()是否成功。

你想要做的是if(mkdir (...) == 0)

此外,如果發生故障,您沒有理由認爲失敗的原因是「訪問被拒絕」錯誤。檢查errno並相應地報告正確的錯誤。

+0

其實我只是鍵入錯誤的問題。在編譯的代碼中,我有'if(!mkdir)if(chdir)error else error'而我仍然有一個問題 – GGWP

+0

我知道了。這個問題還有其他優先事項。編譯器認爲else語句屬於第二個有作用域的IF語句。 – GGWP

3

看起來您需要在if聲明主體周圍花括號,以便else綁定到正確的if語句。