2012-02-16 56 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 
    } 
} 

如果您确保目录名尾随/,这个完美的作品。