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

新手上路,请多包涵

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

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

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

原文由 Jary 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 917
2 个回答

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 — 先进先出
  • S_ISLNK — 符号链接
  • S_ISSOCK 插座

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

原文由 Jonathan Leffler 发布,翻译遵循 CC BY-SA 3.0 许可协议

另一种简单的方法是:

 int check(unsigned const char type) {
    if(type == DT_REG)
        return 1;
    if(type == DT_DIR)
        return 0;
    return -1;
}

然后,您可以将 struct dirent* 对象的 d_type 传递给 检查 函数。

如果检查返回 1,则该路径指向常规文件。

如果检查返回 0,则该路径指向一个目录。

否则,它既不是文件也不是目录(可以是块设备/符号链接等)

原文由 Aishwary Dewangan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题