2012-11-17 60 views
1

從我的家庭作業:爲什麼我需要stat來檢查一個目錄是否已經存在?

備份文件存儲在一個名爲.mybackup一個隱藏目錄,其中 你的程序造成的,如果需要的話。要創建一個目錄,使用mkdir()函數(詳情請點擊這裏) ,但一定要檢查 目錄是否已經存在(使用stat()或檢查E-mail爲 )。如果該目錄已經存在,請不要覆蓋它。

我以爲如果目錄已經存在,mkdir本質上返回-1。我確實在某個地方讀過。我錯了嗎?

+1

我建議檢查[此討論](http://stackoverflow.com/questions/6314042/stat-vs-mkdir-with-eexist):它不是重複的,但非常接近它。 ) – raina77ow

回答

4

mkdir對於任何錯誤都返回-1。因此,要區分錯誤,即要發現目錄是否已經存在,則應使用stat函數或在mkdir返回-1後檢查errnoEEXIST

if(mkdir(".mybackup", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1) 
{ 
    if(errno == EEXIST) 
    { 
     // Directory already exists, do something 
    } 
} 
+0

哦,很好的例子。非常感謝。 – Aerovistae

+0

請注意,您需要包含(用於'mkdir')和(用於處理'errno'和'EEXIST')。對於EMLINK, –

2

mkdir功能可能會失敗的原因有很多:

[EACCES] 搜索權限被拒絕的路徑前綴的一個組成部分,或者拒絕寫入權限的目錄的父目錄被創建。

[EEXIST] 指定的文件存在。

[ELOOP] 循環存在於解析路徑參數期間遇到的符號鏈接中。

[EMLINK] 父目錄的鏈接數將超過{LINK_MAX}。

[ENAMETOOLONG] 路徑參數的長度超過{PATH_MAX}或路徑名組件長於{NAME_MAX}。

[ENOENT] 由路徑指定的路徑前綴的組件不會命名現有目錄,或路徑是空字符串。

[ENOSPC] 文件系統沒有足夠的空間容納新目錄的內容或擴展新目錄的父目錄。

[ENOTDIR] 路徑前綴的組件不是目錄。

[EROFS] 父目錄駐留在只讀文件系統上。 的MKDIR()函數可能會失敗,如果:

[ELOOP] 比路徑參數的分辨率過程中遇到{SYMLOOP_MAX}符號鏈接更多。

[ENAMETOOLONG] 由於在路徑參數的解析中遇到符號鏈接,所以替換的路徑名字符串的長度超過了{PATH_MAX}。

如果函數返回-1你不能沒有檢查errno確保其特定錯誤的,這就是爲什麼它被建議。

+0

+1,典型用戶不太可能在任何現代文件系統上達到此限制,但這些確實發生在現場! –

相關問題