使用readdir获取文件大小

时间:2014-11-14 07:10:07

标签: c linux

我正在调用readdir()从目录中获取文件名信息。我还希望仅在可能的情况下使用readdir()打印文件大小,因为dirent的结构是

struct dirent {
               ino_t          d_ino;       /* inode number */
               off_t          d_off;       /* offset to the next dirent */
               unsigned short d_reclen;    /* length of this record */
               unsigned char  d_type;      /* type of file; not supported
                                              by all file system types */
               char           d_name[256]; /* filename */
           };

我使用d_reclen作为文件大小但不知何故我的程序打印错误的值。但我的问题是:

  1. 使用d_reclen作为文件大小是正确的吗?因为我怀疑它是未签名的短文,它如何为大文件返回正确的大小。
  2. 记录的实际长度是多少?这个大小是字节吗?如何计算正确的尺寸?
  3. 输出

    Actual Size :1bytes File size :20
    Actual Size :4bytes File size :20
    Actual Size :8bytes File size :20
    Actual Size :256bytes File size :20
    Actual Size :0bytes File size :20
    Actual Size :255bytes File size :20
    Actual Size :1023bytes File size :24
    

    编辑1 我使用printf("File size :%hu\n",pent->d_reclen);来打印文件大小,但它没有给出正确的答案。

    编辑2 出于某些性能原因,我想避免使用stat()

2 个答案:

答案 0 :(得分:3)

readdir手册说:

unsigned short d_reclen;    /* length of this record */

“此记录”是“此struct dirent实例”,而不是“此文件”。

在您的情况下(d_reclne 20或24),您不应该访问整个dirent内存,因为readdir只分配了足够的内存来填充d_inod_off,{{1} },d_reclen以及d_type的相关部分。 d_name没有为readdir分配完整的256个字节。

答案 1 :(得分:2)

要获取文件大小,而不是文件名的大小(长度)(d_reclen中记录的内容),您需要stat()statat() (或lstat())系统调用。您无法直接从struct dirent中的信息中获取文件大小。