從我的家庭作業:爲什麼我需要stat來檢查一個目錄是否已經存在?
備份文件存儲在一個名爲.mybackup一個隱藏目錄,其中 你的程序造成的,如果需要的話。要創建一個目錄,使用mkdir()函數(詳情請點擊這裏) ,但一定要檢查 目錄是否已經存在(使用stat()或檢查E-mail爲 )。如果該目錄已經存在,請不要覆蓋它。
我以爲如果目錄已經存在,mkdir本質上返回-1。我確實在某個地方讀過。我錯了嗎?
從我的家庭作業:爲什麼我需要stat來檢查一個目錄是否已經存在?
備份文件存儲在一個名爲.mybackup一個隱藏目錄,其中 你的程序造成的,如果需要的話。要創建一個目錄,使用mkdir()函數(詳情請點擊這裏) ,但一定要檢查 目錄是否已經存在(使用stat()或檢查E-mail爲 )。如果該目錄已經存在,請不要覆蓋它。
我以爲如果目錄已經存在,mkdir本質上返回-1。我確實在某個地方讀過。我錯了嗎?
mkdir
對於任何錯誤都返回-1。因此,要區分錯誤,即要發現目錄是否已經存在,則應使用stat
函數或在mkdir
返回-1後檢查errno
的EEXIST
。
if(mkdir(".mybackup", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1)
{
if(errno == EEXIST)
{
// Directory already exists, do something
}
}
哦,很好的例子。非常感謝。 – Aerovistae
請注意,您需要包含
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
確保其特定錯誤的,這就是爲什麼它被建議。
+1,典型用戶不太可能在任何現代文件系統上達到此限制,但這些確實發生在現場! –
我建議檢查[此討論](http://stackoverflow.com/questions/6314042/stat-vs-mkdir-with-eexist):它不是重複的,但非常接近它。 ) – raina77ow