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

Jar*_*ary 49 c c++ unix directory exists

我无法在线找到问题的解决方案.

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

有没有方便的方法呢?

Jon*_*ler 106

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...
}
Run Code Online (Sandbox Code Playgroud)

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

您还可以使用其他S_IS*宏检查其他文件类型:

  • S_ISDIR - 目录
  • S_ISREG - 常规文件
  • S_ISCHR - 角色设备
  • S_ISBLK - 阻止设备
  • S_ISFIFO - FIFO
  • S_ISLNK - 符号链接
  • S_ISSOCK - 插座

(某些系统也提供了一些其他文件类型; S_ISDOOR例如,可在Solaris上使用.)

  • 不是`char`而是`char*` - 一个字符串.指向函数的POSIX规范的链接表明`stat()`和`lstat()`的第一个参数是`const char*restrict pathname`. (4认同)

cod*_*ict 5

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

编辑:

如果返回值是0您需要额外检查以确保参数实际上是目录而不是文件/ symlink/char特殊文件/ blk特殊文件/ FIFO文件.你可以利用这个st_mode领域stat structure.