检查Unix中是否存在目录(系统调用)

我无法在网上find解决我的问题的方法。

我想在Unix中调用一个函数,传递一个目录的path,并知道它是否存在。 如果一个目录不存在, opendir()返回一个错误,但是我的目标不是实际打开,检查错误,closures它,如果没有错误,而只是检查一个文件是否是一个目录。

请问有什么方便的方法吗?

在POSIX系统上有两个相关的函数: stat()和lstat() 。 这些是用来找出一个path名是否指的是一个实际的对象,你有权限访问,如果是这样,返回的数据告诉你它是什么types的对象。 stat()lstat()之间的区别是,如果你给的名字是一个符号链接,那么stat()遵循符号链接(或链接,如果链接在一起的话),并报告链链接,而lstat()报告符号链接本身。

 #include <sys/stat.h> struct stat sb; if (stat(pathname, &sb) == 0 && S_ISDIR(sb.st_mode)) { ...it is a directory... } 

如果函数指示成功,则使用<sys/stat.h>的S_ISDIR()macros来确定文件是否实际上是一个目录。

您还可以使用其他S_IS*macros检查其他文件types:

  • S_ISDIR – 目录
  • S_ISREG – 普通文件
  • S_ISCHR – 字符设备
  • S_ISBLK – 块设备
  • S_ISFIFO – FIFO
  • S_ISLNK – 符号链接
  • S_ISSOCK – 套接字

(某些系统也提供了其他一些文件types;例如, S_ISDOOR在Solaris上可用。

您可以通过传递目录的名称作为第一个参数来使用stat系统调用。 如果目录存在,则返回0 ,否则返回-1 ,并将errno设置为ENOENT

编辑:

如果返回值为0 ,则需要额外检查以确保参数实际上是目录,而不是文件/符号链接/字符特殊文件/ blk特殊文件/ FIFO文件。 你可以使用这个stat structurest_mode字段。

你可以使用test -d

如果你正在谈论从壳,这里有一个很好的答案。 总结这个答案:

 if [ -d "$DIRECTORY" ]; then # Control will enter here if $DIRECTORY exists fi 

如果你在C程序里面讲话,你可以使用stat()

 { struct stat st; if(stat("/tmp",&st) == 0) printf(" /tmp is present\n"); } 

如果你不关心这个文件系统对象的types,access(name,F_OK)会检查这个名字的存在。 如果您需要确定这是目录,请使用stat()并使用S_ISDIR()macros检查types。

testing和工作正常:

 int file_exist (char *filename) { char s[200]; sprintf(s, "test -e %s", filename); if (system(s) == 0){ return 1; }else{ return 0; } } 

我认为function统计可以做你想做的(我没有testing它的目录)。 在C ++中,你也可以使用boost :: filesystem库。