检查Unix中是否存在目录(系统调用)
我无法在网上找到解决我的问题的方法。
我想在Unix中调用一个函数,传递一个目录的路径,并知道它是否存在。 如果一个目录不存在, opendir()
返回一个错误,但是我的目标不是实际打开,检查错误,如果没有错误,关闭它,而只是检查一个文件是否是一个目录。
请问有什么方便的方法吗?
在POSIX系统上有两个相关的函数:stat()和lstat()。 这些用于查明路径名是否引用您有权访问的实际对象,如果是,则返回的数据会告诉您它是什么类型的对象。 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()宏来确定文件是否实际上是一个目录。
您还可以使用其他S_IS*
宏检查其他文件类型:
S_ISDIR
- 目录 S_ISREG
- 普通文件 S_ISCHR
- 字符设备 S_ISBLK
- 块设备 S_ISFIFO
- FIFO S_ISLNK
- 符号链接 S_ISSOCK
- 套接字 (某些系统也提供其他几种文件类型;例如, S_ISDOOR
在Solaris上可用。)
您可以通过传递该目录的名称作为第一个参数来使用stat
系统调用。 如果该目录存在,则返回0
,否则返回-1
,并将errno设置为ENOENT
编辑:
如果返回值为0
,则需要额外检查以确保参数实际上是一个目录,而不是文件/符号链接/字符特殊文件/ blk特殊文件/ FIFO文件。 你可以使用这个stat structure
的st_mode
字段。
你可以使用test -d