如何通过fd获取文件大小?

发布于 2024-11-17 19:44:54 字数 101 浏览 3 评论 0原文

我知道我可以通过fseek获取FILE *的文件大小,但我所拥有的只是一个INT fd。

在这种情况下如何获取文件大小?

I know I can get file size of FILE * by fseek, but what I have is just a INT fd.

How can I get file size in this case?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

请你别敷衍 2024-11-24 19:44:54

您可以将 lseek一起使用SEEK_END 作为原点,因为它返回文件中的新偏移量,例如。

off_t fsize;

fsize = lseek(fd, 0, SEEK_END);

You can use lseek with SEEK_END as the origin, as it returns the new offset in the file, eg.

off_t fsize;

fsize = lseek(fd, 0, SEEK_END);
手长情犹 2024-11-24 19:44:54

fstat 将起作用。但我不太确定你如何计划通过 fseek 获取文件大小,除非你还使用 ftell (例如,fseek 到最后,然后 ftell 你在哪里)。即使对于 FILE,fstat 也更好,因为您可以从 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 */
       …
       };

fstat will work. But I'm not exactly sure how you plan the get the file size via fseek unless you also use ftell (eg. fseek to the end, then ftell where you are). fstat is better, even for FILE, since you can get the file descriptor from the FILE handle (via fileno).

   stat, fstat, lstat - get file status
   int fstat(int fd, struct stat *buf);

       struct stat {
       …
           off_t     st_size;    /* total size, in bytes */
       …
       };
滥情哥ㄟ 2024-11-24 19:44:54

我喜欢将代码示例编写为函数,以便它们可以剪切并粘贴到代码中:

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) 相同的类型。

I like to write my code samples as functions so they are ready to cut and paste into the code:

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

NOTE: @AnttiHaapala pointed out that st_size is not an int so this code will fail/have compile errors on 64 machines. To fix change the return value to a 64 bit signed integer or the same type as st_size (off_t).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文