在目录上使用lstat并获得不正确的答案

问题描述

我目前正在尝试构建一个程序,该程序提供与 du -s 相同的输出。但是我发现自己有一个我听不懂的错误。我的程序给我的答案比正确答案少8个,对于非常大的目录,答案也有所不同,但是要多得多。对于较小的目录,它总是少给我8个目录,更不用说目录中有多少目录了。

我的第一个想法是,我没有增加实际目录光盘使用量的大小,因此答案不尽人意,但这不是问题。我还认为,当我想检查目录中的文件时,可能会生成损坏的路径,但由于文件无法进行stat()操作,因此我会打印错误

以下代码是我如何增加文件/目录的大小, st_blocks 不会为目录提供正确的大小吗? (然后我将这个答案除以2)

        struct stat sb;
             if(lstat(file,&sb) == -1){
             perror(file);
             exit(EXIT_FAILURE);
        }
        *size += sb.st_blocks;

我用来做低谷运动的基本原理是:

   while((entry = readdir(dir)) != NULL){
        if(!strcmp(entry->d_name,".") || !strcmp(entry->d_name,"..")){
            continue;
        }
        else if(entry->d_type == DT_DIR){
            char path[1024];
            generate_path(path,dir_name,entry->d_name);
            traverse_dir(path,total_size);
            get_size_from_dir(path,total_size);

        }
        else{
            char path[1024];
            generate_path(path,entry->d_name);
            get_size_from_single_file(path,total_size);
        }
    }

在此函数之外,我在哪里获得原始目录的大小。我使用st_blocks是否对吗?我尝试使用st_size,但是由于我说我所有文件的大小都为4096,所以我得不到正确答案。我对此并不陌生,因为这是我的第一本,所以我对lstat的工作方式没有足够的了解时间使用它,我已经阅读了手册的内容,但并不太了解我做错了什么。谁能指出我正确的方向?

解决方法

警告:

  • 在空目录 du 上返回4,您的程序将返回0(无文件)

  • 在没有文件但包含空目录du -s的目录上返回8(4 + 4),并且您的程序将返回0(没有文件)

so du 不仅返回文件所需的大小,还返回目录的大小,但是您的程序仅考虑文件=>您的程序计算的结果少于 du