检查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 structure
的st_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库。