打印目录维度时的大小错误(st_size)

时间:2017-05-13 12:18:20

标签: c linux

我想要目录的大小,但对于每个目录,程序打印“4096”。如何打印实际尺寸?

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<sys/stat.h>

int main(int argc,char* argv[]){
        int i,p[2];
        pipe(p);
        struct stat buf;

        for(i=1; i<argc; i++){
                        printf("%s\n",argv[i]);
                        stat(argv[i],&buf);
                        if(S_ISDIR(buf.st_mode)){
                                printf("%s is a directory\n",argv[i]);
                                printf("%zu", buf.st_size);
                         }
         }

         return 0;
}

我尝试了printf("%llu", (unsigned long long)buf.st_zise)printf("%lu",(long unsigned)buf.st_size),但结果是一样的。

1 个答案:

答案 0 :(得分:0)

您无法使用stat()查找目录内容的大小。它不是递归的。它只是告诉你目录节点(没有子节点)的大小是4096字节(即一个块)。

相反,您需要递归遍历整个目录,总结内部所有文件的大小。请注意,因为里面可能有符号链接,硬链接甚至是圆形链接!如果您只关心获取目录第一级的总大小(即文件立即在其中),将会更容易。

有关为什么这并不像您想象的那么容易,请参阅2004年的这篇永恒的帖子:https://blogs.msdn.microsoft.com/oldnewthing/20041228-00/?p=36863