FILE* fd = fopen(argv[1], "rb");
fseek(fd, 0, SEEK_END);
size_t flen = ftell(fd);
if (flen == ((size_t)-1)) {
printf("%s is a directory.\n", argv[1]);
fclose(fd);
exit(1);
}
现在,在Linux下,fopen()
打开目录时返回有效的文件描述符。这导致寻找操作返回-1
(或者,因为size_t
是无符号的,在64位系统上0xFFFFFFFFFFFFFFFF
= 264 - 1)。
不幸的是,上面的代码中的条件(flen == ((size_t)-1)
)没有捕获到这种情况,flen == 0xFFFFFFFF
也是如此(编辑:应为0xFFFFFFFFFFFFFFFF
)。 printf()
命令使用%x
或%d
作为格式字符串,显示比较的两侧应具有相同的值。
为什么即使两个方面都是相同类型的(size_t
),比较运算符也会以这种奇怪的方式行事?我使用gcc 4.8.1编译器。
sizeof(size_t)-1
? - Scotty Bauerflen == ((size_t)-1)
。 - Scotty Baueropen()
函数打开一个目录(从而使用fopen()
函数),但这也是你能做的全部。其目的是允许您在文件描述符上使用fchdir()
函数。如果要读取目录,则需要使用opendir()
、readdir()
等函数。如果要查找其大小,则可以使用fstat(fileno(fd))
函数,尽管我认为将fd
用于FILE *
而不是文件描述符的命名方式很糟糕(我会使用FILE *fp = fopen("file", "r"); int fd = fileno(fp);
)。 - Jonathan Leffler