2015-05-05 64 views
3

我正在使用if(strstr(dir->d_name, ".") == NULL && strstr(dir->d_name, "..")來檢查它的目錄/子目錄,但是這仍然打印出一些不是目錄的文件...使用直接結構和DIR。如何檢查文件名是否是C目錄?

+1

你能展示更多的代碼嗎? –

+1

根據操作系統的不同,如果您閱讀[readdir手冊頁](http://man7.org/linux/man-pages/man3/readdir.3.html),您將看到它有一個名爲' d_type「是目錄條目的」文件「類型。 –

+0

請參閱[在Unix系統調用中檢查目錄是否存在](http://stackoverflow.com/questions/3828192/checking-if-a-directory-exists-in-unix-system-call)爲不工作時的答案使用'readdir()'等,或者當你的系統只提供來自[''](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/)的'struct dirent'的POSIX規範的最小信息時dirent.h.html)定義(它是'd_name'和'd_ino')。更適應系統可以提供直接存儲在'struct dirent'結構中的擴展信息中的文件類型。 –

回答

3

strstr在另一個字符串內搜索一個子字符串,因此它將返回匹配每個名稱包含一個(好,或雙)期間。

你可能想用的strcmp

if (strcmp(dir->d_name, ".") && strcmp(dir->d_name, "..")) 
    .. not one of the default root folders .. 

之前或之後,您可以檢查它是否是一個文件夾或不:

if (dir->d_type == DT_DIR) 
    .. 

或使用stat。 (請注意,d_type可能不支持某些文件系統類型。)

0

如果您在Linux上,可以使用包含條目類型的getdents。否則,您可能不得不使用stat/lstat來獲取每個項目的類型信息。

1

就個人而言,我喜歡stat()和fstat()。然後用S_ISDIR(m)這樣的宏查看輸出的st_mode字段。

相關問題