2012-02-16 85 views
20

我使用opendir函數來檢查目錄是否存在。問題是我在一個巨大的循環中使用它,它膨脹了我的應用程序使用的內存。C更快的方法來檢查目錄是否存在

什麼是最好(最快)的方式來檢查目錄是否存在於C?如果不存在,最好(最快)的方法是什麼?

+7

愚蠢的問題,你後來調用'closedir()'? – user7116 2012-02-16 16:04:42

+0

更快的方式可能是異步執行,但您應該考慮媒體的功能。如果它是普通硬盤,那麼它可能會陷入尋找風暴,這將工作緩慢。但是,如果您使用RAID/SSD或甚至在雲中工作,這將工作。 – LiMar 2012-02-16 16:09:30

回答

16

你可以稱之爲mkdir()。如果該目錄不存在,那麼它將被創建並返回0。如果該目錄存在,則將返回-1,並且errno將被設置爲EEXIST

+2

有跡象表明,如果路徑中的某些東西不存在,也可能發生「ENOENT」。 – user7116 2012-02-16 16:07:22

+0

是的。應該提到這一點。 – ckruse 2012-02-16 16:08:39

+2

它比stat更快嗎? – 2012-02-16 17:02:29

2

如果有的話,我會用stat()

39

考慮使用statS_ISDIR(s.st_mode)會告訴你它是否是一個目錄。

樣品:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

... 
struct stat s; 
int err = stat("/path/to/possible_dir", &s); 
if(-1 == err) { 
    if(ENOENT == errno) { 
     /* does not exist */ 
    } else { 
     perror("stat"); 
     exit(1); 
    } 
} else { 
    if(S_ISDIR(s.st_mode)) { 
     /* it's a dir */ 
    } else { 
     /* exists but is no dir */ 
    } 
} 
... 
+1

與opendir相比有多快? – 2012-02-16 16:22:02

+3

這取決於操作系統和父目錄中的條目數。它會以任何方式更快,這就是'stat'的原因。 – 2012-02-16 16:24:17

+0

Linux 64位,1條目 – 2012-02-16 17:02:59

0

這聽起來像你有內存泄漏。只要您記得在成功打開目錄後始終調用closedir,調用opendir就不應使應用程序的RAM膨脹。另外,請確保您釋放您分配的任何緩衝區來計算目錄名稱。

+0

Yeap我正在關閉它,我只是使用stat,謝謝你的時間! – 2012-02-16 16:28:19

16

我更喜歡使用access()

if (0 != access("/path/to/possible_dir/", F_OK)) { 
    if (ENOENT == errno) { 
    // does not exist 
    } 
    if (ENOTDIR == errno) { 
    // not a directory 
    } 
} 

如果您確保目錄名尾隨/,這個完美的作品。