Estou tentando descobrir como o programa /bin/ls -l
calcula o tamanho total (contagem de blocos) de um diretório.
Com isso, quero dizer a saída total number
que é impressa logo antes do conteúdo do diretório.
Há uma pergunta semelhante aqui: link , mas não responde totalmente à pergunta nem explica exatamente como ela é calculada.
Eu tentei adicionar os números de blocos de 512B
para todos os arquivos (não ocultos) em um diretório.
Aqui está como eu estou tentando fazer isso (em C):
int getBlockSize(char* directory) {
int size = 0;
DIR *d;
struct dirent *dir;
struct stat fileStat;
d = opendir(directory);
if (d) {
while ((dir = readdir(d)) != NULL) {
if (dir->d_name[0] != '.') { // Ignore hidden files
// Create the path to stat
char info_path[PATH_MAX + 1];
strcpy(info_path, directory);
if (directory[strlen(directory) - 1] != '/')
strcat(info_path, "/");
strcat(info_path, dir->d_name);
stat(info_path, &fileStat);
size += fileStat.st_blocks;
}
}
}
return size;
}
No entanto, isso está me dando um número muito diferente em relação ao comando ls
.
O que está "errado" com minha abordagem? Como ls
calcula o total?
Editar:
Para testar, criei uma pasta que contém os arquivos test_file1.txt
e test_file2.txt
, cada um contendo o texto Hello World!
. Quando eu executo ls -l
, recebo a seguinte saída
total 1
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file1.txt
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file2.txt
No entanto, quando executo meu código usando o método acima, obtenho
total 2
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file1.txt
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file2.txt