0

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

检查您是否正在尝试打开或刚刚打开目录的最佳方法是什么?目的是因为“哎呀,文件名错误”而不是“恐慌,我们有一个文件但读取不起作用”而失败?

4

1 回答 1

7

在文件描述符上调用 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 代码。

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

于 2013-08-01T12:14:12.857 回答