Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何通过fd获得文件大小?_C_Filesize - Fatal编程技术网

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);
}