我正在调用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
作为文件大小但不知何故我的程序打印错误的值。但我的问题是:
d_reclen
作为文件大小是正确的吗?因为我怀疑它是未签名的短文,它如何为大文件返回正确的大小。输出
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()
。
答案 0 :(得分:3)
readdir
手册说:
unsigned short d_reclen; /* length of this record */
“此记录”是“此struct dirent
实例”,而不是“此文件”。
在您的情况下(d_reclne
20或24),您不应该访问整个dirent内存,因为readdir只分配了足够的内存来填充d_ino
,d_off
,{{1} },d_reclen
以及d_type
的相关部分。 d_name
没有为readdir
分配完整的256个字节。
答案 1 :(得分:2)
要获取文件大小,而不是文件名的大小(长度)(d_reclen
中记录的内容),您需要stat()
或statat()
(或lstat()
)系统调用。您无法直接从struct dirent
中的信息中获取文件大小。