2011-11-11 141 views
1

readdir返回目錄中所有項目的信息。我怎麼知道這個項目是文件還是目錄?readdir:我怎麼知道它是一個文件還是目錄

謝謝。

編輯。對不起,忘了提及,我的時間目標平臺是iOS和Android。

+0

我不確定'readdir'在iOS應用程序中是否可用。無論如何,在該平臺上,通過使用NSFileManager和可以識別目錄的'-fileType'輔助方法可以更好地服務。 –

+0

研究之後,似乎'readdir'可以在iOS上使用,但是在iOS 4.x上有一些錯誤實現:https://devforums.apple.com/message/251591。我仍然建議爲此使用NSFileManager的更高級抽象。 –

回答

6

檢查d_typeD_DIR

+0

它不符合POSIX標準。 – pic11

+0

@ pic11,看到我對巴西爾的回答的評論。 –

+0

使用'd_type'是可能比調用'stat'爲每項快約50-1000倍,但你可能應該包括系統回退代碼,其中'd_type'不存在,或在情況下,它沒有填寫。 –

0

您也可以計算在目錄中的每個條目的路徑(但也許你可以跳過. & ..項),並使用stat系統調用路徑上。

如果您需要路徑上的更多信息(例如,修改時間,大小...),這非常有用。

+0

對於不支持'd_type'的系統,它可能也很有用,但由於問題被標記爲'linux' ,這是不太可能成爲問題的。 –

+1

沒有必要計算路徑。 (至少,不在Linux上> 2.6.16)由於使用了readdir,因此已經有一個開放的dirent,所以你可以使用fstatat和d_name中給出的相對路徑。 (使用dirfd()來獲取fd)。 –

+0

是的,你是對的。但我會相信'fstatat'可能不太方便。 –

1

的dirent包含一個成員d_type可以計算爲0x8中,如果它是一個文件,所以:

struct dirent *DirEntry; 
... 
if (DirEntry->d_type == 0x8) 
     //is a file 
1

這取決於,在標準的「POSIX」 READDIR操作不必領域d_type

根據POSIX,dirent結構包含未指定大小的字段char d_name [],最多NAME_MAX個字符在終止空字節之前。 POSIX.1-2001還將字段ino_t d_ino記錄爲XSI擴展。使用其他>字段會損害程序的可移植性。

「標準方法」是做一個LSTAT呼叫你的文件/目錄,並檢查struct stat中的st_mode字段,如果你的ST_MODE比賽S_ISDIR,你有一個目錄。

相關問題