c - 仅当不是目录时才打开文件

标签 c linux unix file-io

在 Linux 上,如果给定目录名称而不是常规文件,open(filename, O_RDONLY) 似乎会成功(尽管随后的 read() 调用似乎失败,这是意料之中的)。

检查您是否正在尝试打开或刚刚打开目录的最佳方法是什么工作'?

最佳答案

在文件描述符上调用 fstat() 并检查文件的模式:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

// ...

int fd = open(filename, O_RDONLY)
if (fd == -1) {
    // open() failed.
}
struct stat buf;
if (fstat(fd, &buf) != 0) {
    // fstat() failed.
}
if (S_ISDIR(buf.st_mode)) {
    // It's a directory.
}

这都是可移植的 POSIX 代码。

请注意,您可以在调用 open() 之前对 filename 使用 stat()。但这可能会导致文件在 stat() 和 open() 调用之间发生变化,这意味着您将 open() 一个与您使用 stat() 检查的文件不同的文件。使用 fstat() 提供了针对这种情况的弹性,因为即使文件被删除,文件描述符仍将指向正确的文件。

关于c - 仅当不是目录时才打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17993518/

相关文章:

c - Glade UI 构建器不允许我将对象分配为信号参数

Linux Lubuntu Eclipse Checkstyle SWT 错误

linux - 通过脚本对应用程序进行 chmod

linux - 每秒 Ping 服务器以查看正常运行时间

c - C中的双向链表快速排序

c++ - 用于在 linux 中获取 CPU 负载的 C API

无法将结构的地址分配给类型为指向该结构的指针的 typedef 的变量

linux - pthread_cond_timedwait() 等待时间不低于 1 秒? (Linux)

linux - UDP 服务器出现段错误

linux - 如何使用脚本中的文件路径变量在 FreeBSD 中发送邮件?