问题描述
我目前正在尝试构建一个程序,该程序提供与 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