Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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 使用readdir获取文件大小_C_Linux - Fatal编程技术网

C 使用readdir获取文件大小

C 使用readdir获取文件大小,c,linux,C,Linux,我打电话给readdir是为了从文件名目录中获取信息。我还希望仅在可能的情况下使用readdir打印文件大小,因为dirent的结构是 我使用d_recen作为文件大小,但不知为什么我的程序打印了错误的值。但我的问题是: 使用d_recen作为文件大小是否正确?因为我怀疑它是无符号的短文件,它如何返回大文件的正确大小。 记录的实际长度是多少?这个大小是以字节为单位的吗?如何计算正确的尺寸? 输出 编辑1 我正在使用打印文件大小:%hu\n,pent->d\u recen;打印文件大小,但它没有给

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

我使用d_recen作为文件大小,但不知为什么我的程序打印了错误的值。但我的问题是:

使用d_recen作为文件大小是否正确?因为我怀疑它是无符号的短文件,它如何返回大文件的正确大小。 记录的实际长度是多少?这个大小是以字节为单位的吗?如何计算正确的尺寸? 输出

编辑1 我正在使用打印文件大小:%hu\n,pent->d\u recen;打印文件大小,但它没有给出正确答案

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

手册上说:

此记录是此结构目录实例,而不是此文件


对于d_reclen 20或24,您不应该访问整个dirent内存,因为readdir只分配了足够的内存来填充d_ino、d_off、d_reclen、d_type和d_name的相关部分。readdir没有为d_name分配完整的256字节。

要获取文件大小,与d_recen中记录的文件名大小长度相反,您需要stat或stat或lstat系统调用。无法直接从struct dirent中的信息获取文件大小。

from。。POSIX.1要求的dirent结构中的唯一字段是:d_name[],大小未指定,在终止的空字节“\0”之前最多包含name_MAX个字符;并作为XSI扩展d_ino。其他字段未标准化,并非在所有系统上都存在。@SouravGhosh:可移植性不是问题。1与其报告没有给出正确答案,不如报告输出和预期输出更有用2 d_Recen的值是此项的记录长度,而不是文件大小。3 IMO,stat.@chux:请查看编辑。记录长度和大小有什么不同?我是说唱片里有什么。我认为record是文件数据,所以record length是文件大小。
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 */
           };
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
unsigned short d_reclen;    /* length of this record */