【问题标题】:How do you get file size by fd?你如何通过 fd 获取文件大小?
【发布时间】:2011-09-26 02:48:51
【问题描述】:

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

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

【问题讨论】:

  • 尝试fdopen 从文件描述符中获取FILE*
  • AFAIR C(即 C 库)对文件描述符一无所知。请在您的问题和标签中更加准确。

标签: c filesize


【解决方案1】:

您可以使用lseekSEEK_END 作为原点,因为它会返回文件中的新偏移量,例如。

off_t fsize;

fsize = lseek(fd, 0, SEEK_END);

【讨论】:

  • 我认为最好提到将读/写“指针”移回是个好主意,因为在此之后可能无法阅读。
  • 值得注意的是:如果文件描述符是共享内存,lseek 会返回0 而不管实际大小。
【解决方案2】:

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 */
       …
       };

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • s.st_size 不是 int 类型
    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多