仅在不是目录的情况下打开文件

时间:2013-08-01 12:02:36

标签: c linux unix file-io

在Linux上,如果给定目录的名称而不是常规文件,则open(filename, O_RDONLY)似乎成功(尽管后续的read()调用似乎失败,这只是预期)。

检查您是否尝试打开或刚刚打开目录的最佳方法是,为了使用“oops,错误的文件名”而不是“恐慌”失败,我们有一个文件但读取不是工作'?

1 个答案:

答案 0 :(得分:6)

在文件描述符上调用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()调用之间发生变化,这意味着你打开()一个不同的文件,然后是你用stat()检查的文件。使用fstat()可以提供弹性,因为即使文件描述符被删除,它仍然会指向正确的文件。