readdir
和 scandir
是 Linux 系統中用于讀取目錄內容的兩個函數。它們都提供了遍歷目錄并獲取目錄項信息的功能,但在實現和使用上有一些區別。
readdir
是一個較早的函數,定義在 <dirent.h>
頭文件中。它的原型如下:
struct dirent *readdir(DIR *dirp);
readdir
函數接受一個 DIR
類型的指針作為參數,該指針是通過 opendir
函數打開目錄后返回的。每次調用 readdir
都會返回一個指向 dirent
結構體的指針,該結構體包含了目錄項的信息,如文件名、文件類型等。當沒有更多的目錄項時,readdir
返回 NULL
。
scandir
是一個較新的函數,定義在 <dirent.h>
頭文件中,它在 POSIX 標準中有所規定。它的原型如下:
int scandir(const char *dir, struct dirent ***namelist, int (*filter)(const struct dirent *), int (*compar)(const void *, const void *));
scandir
函數接受四個參數:
dir
:要掃描的目錄路徑。namelist
:一個指向 dirent
結構體指針數組的指針,用于存儲目錄項信息。filter
:一個可選的過濾函數,用于決定是否將某個目錄項添加到結果數組中。如果為 NULL
,則所有目錄項都會被添加。compar
:一個可選的比較函數,用于對結果數組中的目錄項進行排序。如果為 NULL
,則結果數組不會被排序。scandir
函數返回一個整數,表示成功時添加到結果數組中的目錄項數量,失敗時返回 -1
。
readdir
只能讀取目錄內容,而 scandir
可以讀取目錄內容并對結果進行過濾和排序。readdir
返回一個指向 dirent
結構體的指針,而 scandir
返回一個整數,表示成功時添加到結果數組中的目錄項數量。scandir
通常比 readdir
更快,因為它一次性讀取所有目錄項并分配內存,而 readdir
每次調用都需要分配內存。scandir
提供了更多的功能,但使用起來可能稍微復雜一些。readdir
更簡單,但功能有限。總之,如果你需要讀取目錄內容并對結果進行過濾和排序,建議使用 scandir
。如果你只需要簡單地讀取目錄內容,可以使用 readdir
。