在目录上使用 lstat() 并得到不正确的答案
using lstat() on directories and getting incorrect answers
我目前正在尝试构建一个程序,以提供与 du -s 相同的输出。但是我发现自己有一个我无法理解的错误。我的程序会给我比正确答案少 8 分的答案,对于非常大的目录,答案也会有所不同,但会相差更多。对于较小的目录,它总是少给我 8 个目录,不管一个目录中有多少个目录等。
我的第一个想法是我没有添加实际目录磁盘使用的大小,因此没有得到答案,但这不是问题所在。我还认为,当我想检查目录内的文件时,我可能会生成损坏的路径,但随后我会打印错误,因为该文件无法 stat()。
下面的代码是我如何为 files/directories 添加大小的,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, dir_name, entry->d_name);
get_size_from_single_file(path, total_size);
}
}
我在哪里可以得到这个函数之外的原始目录的大小。我用st_blocks是不是错了?我试过使用 st_size 但后来我没有接近正确答案,因为它说我所有的文件都有 4096 的大小。我是新手,对 lstat 的工作原理没有足够深入的了解因为这是我第一次使用它,所以我已经阅读了手册但并不真正理解我做错了什么。谁能指出我正确的方向?
警告:
在空目录上 du returns 4,您的程序将 return 0(没有文件)
在没有文件但包含空目录的目录上 du -s
returns 8 (4+4) 并且您的程序将 return 0(没有文件)
等等
so du returns 不仅文件需要的大小而且目录也需要,但是你的程序只考虑文件 => 你的程序计算小于 du
我目前正在尝试构建一个程序,以提供与 du -s 相同的输出。但是我发现自己有一个我无法理解的错误。我的程序会给我比正确答案少 8 分的答案,对于非常大的目录,答案也会有所不同,但会相差更多。对于较小的目录,它总是少给我 8 个目录,不管一个目录中有多少个目录等。
我的第一个想法是我没有添加实际目录磁盘使用的大小,因此没有得到答案,但这不是问题所在。我还认为,当我想检查目录内的文件时,我可能会生成损坏的路径,但随后我会打印错误,因为该文件无法 stat()。
下面的代码是我如何为 files/directories 添加大小的,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, dir_name, entry->d_name);
get_size_from_single_file(path, total_size);
}
}
我在哪里可以得到这个函数之外的原始目录的大小。我用st_blocks是不是错了?我试过使用 st_size 但后来我没有接近正确答案,因为它说我所有的文件都有 4096 的大小。我是新手,对 lstat 的工作原理没有足够深入的了解因为这是我第一次使用它,所以我已经阅读了手册但并不真正理解我做错了什么。谁能指出我正确的方向?
警告:
在空目录上 du returns 4,您的程序将 return 0(没有文件)
在没有文件但包含空目录的目录上
du -s
returns 8 (4+4) 并且您的程序将 return 0(没有文件)等等
so du returns 不仅文件需要的大小而且目录也需要,但是你的程序只考虑文件 => 你的程序计算小于 du