2015-05-17 56 views
1

我正在將一個C庫移植到OSX上,直到現在還沒有讓我頭痛。在接下來的功能:OSX上的mkdir失敗,EPERM

int createDirectory(char *directory){ 

    int error; 

    error = mkdir(directory, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 

    if(error < 0){ 

     if(errno != EEXIST){  

      return errno;   

     } 

    } 

    return error; 

} 

不管是什麼directory是,mkdir()總是失敗EPERM(不允許的操作)。我不確定xcode可執行文件是否被沙箱化,或者我錯過了什麼,但是我傳遞給函數的每個路徑都失敗。

我試圖從終端mkdir和創建沒有問題的文件夾,所以我不知道問題出在哪裏。此功能在Linux和Solaris中正常工作。

實施例的路徑:

"~/Library/Application\\ Support/myApp" 
"~/Desktop/myApp" 

第一個是一個目錄庫應該創建的一個實際的例子。

+5

'〜' - 擴展是一個shell事物。嘗試沒有。 – Mat

+1

獲取'$ HOME'環境變量的內容並替換'〜'。 – trojanfoe

+0

'EPERM'?真?這很有趣,因爲這個錯誤代碼不是'mkdir()'的文檔:https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/mkdir.2.html我會期待'ENOENT'。 – alk

回答

3

OSX不擴展'~'字符爲bash(儘管它使用bash)。

鑑於這一方案,在/tmp運行:從Solaris 10

/private/tmp/~/Library 

我得到的Linux(Debian的)這個結果,以及:

#include <stdlib.h> 
#include <sys/stat.h> 
#include <stdio.h> 

int main(void) 
{ 
    char *given = "~/Library"; 
    char result[1024]; 
    char *s; 
    mkdir("~", 0755); 
    mkdir("~/Library", 0755); 
    if ((s = realpath(given, result)) != 0) { 
     printf ("%s\n", s); 
    } else { 
     perror("realpath"); 
    } 
    return 0; 
} 

我得到OSX這個結果

/tmp/~/Library 

正如在中指出的那樣Why doesn't the tilde (~) expand inside double quotes?,原本是cshshell功能其中bashincorporated很久以前(引自1994年的一個頁面)。它沒有在任何給定系統的運行時庫中實現。

+0

錯誤..這將如何回答OP的'EPERM'問題? – alk

+0

問題的根源在於OP對問題的誤解 - 'EPERM'很有趣,但與解決問題無關。 –

+0

謝謝,問題確實是'〜'。其他實現都沒有使用〜,但是當我編寫配置文件時,我認爲我正在和一個shell終端通信。另外,正如@alk所說,我仍然不知道爲什麼我得到EPERM而不是ENOENT。 – whitelionV