【发布时间】:2011-09-26 02:48:51
【问题描述】:
我知道我可以通过fseek 获得FILE * 的文件大小,但我所拥有的只是一个 INT fd。
在这种情况下如何获取文件大小?
【问题讨论】:
-
尝试
fdopen从文件描述符中获取FILE*。 -
AFAIR C(即 C 库)对文件描述符一无所知。请在您的问题和标签中更加准确。
我知道我可以通过fseek 获得FILE * 的文件大小,但我所拥有的只是一个 INT fd。
在这种情况下如何获取文件大小?
【问题讨论】:
fdopen 从文件描述符中获取FILE*。
您可以使用lseek 和SEEK_END 作为原点,因为它会返回文件中的新偏移量,例如。
off_t fsize;
fsize = lseek(fd, 0, SEEK_END);
【讨论】:
lseek 会返回0 而不管实际大小。
fstat 会起作用。但是我不确定您如何计划通过 fseek 获取文件大小,除非您还使用 ftell(例如 fseek 到最后,然后 ftell 你在哪里)。 fstat 更好,即使对于 FILE,因为您可以从 FILE 句柄(通过 fileno)获取文件描述符。
stat, fstat, lstat - get file status
int fstat(int fd, struct stat *buf);
struct stat {
…
off_t st_size; /* total size, in bytes */
…
};
【讨论】:
我喜欢将我的代码示例编写为函数,以便将它们剪切并粘贴到代码中:
int fileSize(int fd) {
struct stat s;
if (fstat(fd, &s) == -1) {
int saveErrno = errno;
fprintf(stderr, "fstat(%d) returned errno=%d.", fd, saveErrno);
return(-1);
}
return(s.st_size);
}
注意:@AnttiHaapala 指出 st_size 不是 int 因此此代码将在 64 台机器上失败/编译错误。修复将返回值更改为 64 位有符号整数或与 st_size (off_t) 相同的类型。
【讨论】: