【发布时间】: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)))然后递归进去。