C 如何通过fd获得文件大小?
我知道我可以通过C 如何通过fd获得文件大小?,c,filesize,C,Filesize,我知道我可以通过fseek获得file*的文件大小,但我只有一个INT-fd 在这种情况下,如何获取文件大小?fstat可以工作。但我不太确定如何计划通过fseek获取文件大小,除非您也使用ftell(例如,fseek到底,然后ftell到底在哪里)。fstat更好,即使对于FILE,因为您可以从文件句柄(通过fileno)获取文件描述符 您可以使用withSEEK\u END作为原点,因为它返回文件中的新偏移量,例如 off_t fsize; fsize = lseek(fd, 0, SEE
fseek
获得file*
的文件大小,但我只有一个INT-fd
在这种情况下,如何获取文件大小?fstat可以工作。但我不太确定如何计划通过fseek获取文件大小,除非您也使用ftell(例如,fseek到底,然后ftell到底在哪里)。fstat更好,即使对于FILE,因为您可以从文件句柄(通过fileno)获取文件描述符 您可以使用with
SEEK\u END
作为原点,因为它返回文件中的新偏移量,例如
off_t fsize;
fsize = lseek(fd, 0, SEEK_END);
我喜欢将我的代码示例编写为函数,以便它们可以剪切并粘贴到代码中:
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)相同的类型。尝试从文件描述符中获取
文件*
。AFAIR C(即C库)对文件描述符一无所知。请更准确地回答您的问题和标记。我认为最好是将读/写“指针”向后移动,因为之后可能无法读取。值得注意的是:如果文件描述符是共享内存,lseek
返回0
而不考虑实际大小。s.st_大小不是int类型
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);
}