【问题标题】:using lstat() on directories and getting incorrect answers在目录上使用 lstat() 并得到不正确的答案
【发布时间】:2020-10-11 15:04:52
【问题描述】:

我目前正在尝试构建一个输出与 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;

我使用的 rekursion 的基本原理是:

   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, dir_name, entry->d_name);
            get_size_from_single_file(path, total_size);
        }
    }

我在哪里得到这个函数之外的原始目录的大小。我使用 st_blocks 有错吗?我试过使用 st_size 但我没有接近正确的答案,因为它说我所有的文件的大小都是 4096。我是新手,对 lstat 的工作原理没有足够的了解,因为这是我的第使用它的时间,我已经阅读了手册,但并不真正理解我做错了什么。谁能指出我正确的方向?

【问题讨论】:

  • 需要minimal reproducible example,而不是 sn-p 和一些伪代码。
  • 很难理解你的伪代码,“下一个目录的路径”和“新路径”有什么区别?在“文件路径”和“新路径”之间? readdir 的返回值通常是共享的,因此您必须使用 readdir before 的给定调用的值再次调用 readdir Where i get the size of the orignal directory outside of this funtion:什么功能?那你使用有效数据吗?您是否为 du 提供其他选项?是使用选项--block-size=512 给出与没有then divide this answer by 2 的程序相同的结果吗? “K”可以是 1000 或 1024
  • d_type 仅在 Linux 上受支持,即使在 Linux 上,也并非在所有文件系统上都受支持。仅将其视为提示。但是由于你已经lstat(2)了所有的文件,使用d_type你什么也得不到,你只会让你的代码变得脆弱和不可移植。
  • 既然是学校项目,最好听我的建议,不要使用d_type——它可能会影响你的成绩;-) 只需lstat(2)任何目录条目,添加它的sb.st_blocks,然后if(S_ISDIR(sb.st_mode))) 然后递归进去。

标签: c unix stat


【解决方案1】:

警告:

  • 在一个空目录du返回4,你的程序将返回0(没有文件)

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

so du 不仅返回文件所需的大小,还返回目录所需的大小,但你的程序只考虑文件 => 你的程序计算小于 du em>

【讨论】:

  • 再次感谢您的宝贵时间,这正是我缺乏和需要的知识。将尝试实现这一点!
  • @forsb 我不知道 du 不仅计算文件,注意 4 可能更多,以防有 lof 文件/子-dir 在目录中
  • 刚刚根据您给我的信息实施了一个新的解决方案,现在即使对于非常大的目录也可以正确计算!再次感谢非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多