2013-03-22 49 views
0

如何在調用C中的readdir()時檢查ent.d-> name是否爲文件或目錄,其中ent的類型爲struct dirent *。在C中的readdir()中標識目錄

+0

我注意到你有一個(因此)帳戶。編程問題在那裏。如果由於某種原因,您無法在此發佈信息,例如由於問題禁止,那麼沒有理由在此發佈編程問題。 – 2013-03-22 13:58:09

回答

2

這就是S_ISREG()S_ISDIR()stat(2)一起使用。詳情請見手冊頁。

如果您的生活環境不完全符合POSIX標準,您可以分別使用DT_REG()DT_DIR()來檢查目錄性與規則性。這在readdir(3)的手冊頁中提到。

+0

您可能想使用'lstat',而不是'stat'。 (你是否假設OP在詢問Linux?) – 2013-03-22 14:24:06

+0

爲什麼?該選擇取決於您是要識別符號鏈接還是遵循它們。 – 2013-03-22 14:51:38

+0

@DavidSchwartz另外,手冊頁提到了兩者,並解釋了它們之間的區別。無論如何,這個答案本身並不足以寫出整個代碼(而且這個答案是在問題仍在SuperUser上時寫的)。 – 2013-03-22 14:55:38

0

另一種方法是嘗試調用執行opendir()在d_name,看是否返回null:

int isDir(struct dirent *ent) 
{ 
    if (ent && strcmp(ent->d_name, ".") && strcmp(ent->d_name, "..")) // don't include pwd and parent dir 
    { 
     DIR *isDir = opendir(ent->d_name); 
     if (isDir) 
      return 1; 
    } 
    return 0; 
} 
+0

你應該在某個時候關閉DIR ... – DanZimm 2013-03-22 15:16:44

+0

假設POSIX,readdir()已經返回OP所要求的信息,所以opendir()在最好的情況下是多餘的,最壞的情況是懲罰。 – 2013-03-22 15:21:26