2017-05-13 4 views
0

Ich möchte die Größe der Verzeichnisse, aber für jedes Verzeichnis das Programm druckt "4096". Wie kann ich die tatsächliche Größe drucken?Falsche Größe beim Drucken Verzeichnisse Dimension (st_size)

#include<stdio.h> 
#include<stdlib.h> 
#include<unistd.h> 
#include<sys/wait.h> 
#include<sys/types.h> 
#include<sys/stat.h> 

int main(int argc,char* argv[]){ 
     int i,p[2]; 
     pipe(p); 
     struct stat buf; 

     for(i=1; i<argc; i++){ 
         printf("%s\n",argv[i]); 
         stat(argv[i],&buf); 
         if(S_ISDIR(buf.st_mode)){ 
           printf("%s is a directory\n",argv[i]); 
           printf("%zu", buf.st_size); 
         } 
     } 

     return 0; 
} 

Ich versuchte printf("%llu", (unsigned long long)buf.st_zise), printf("%lu",(long unsigned)buf.st_size) aber die Ergebnisse sind die gleichen.

+1

Eine schnelle Suche nach 'off_t', die Art der' st_size', sagt „off_t soll Ganzzahlige Typen mit Vorzeichen ". Probieren Sie stattdessen einen signierten Modifikator in 'printf'. – Evert

+0

Oder einfach mit * Warnungen auf * kompilieren: 'gcc -Wall whatever.c' gibt" Warnung: Format gibt den Typ 'size_t' (aka 'unsigned long') aber das Argument hat den Typ 'off_t' (aka 'long long') [-W Format] ". – Evert

+1

Da 'ls' auch' 4096' als Größe von Verzeichnissen ausgibt, würde ich sagen, dass es wie vorgesehen funktioniert. – EOF

Antwort

0

Sie können nicht verwenden, um die Größe des Inhalts eines Verzeichnisses zu finden. Es ist nicht rekursiv. Es sagt Ihnen einfach, dass die Größe des Verzeichnisknotens (ohne Kinder) 4096 Bytes (d. H. Ein Block) beträgt.

Stattdessen müssen Sie rekursiv das gesamte Verzeichnis durchlaufen und die Größe aller darin enthaltenen Dateien summieren. Und pass auf, denn es könnte Symlinks, harte Links und sogar zirkuläre Links geben! Es wird einfacher sein, wenn Sie nur die Gesamtgröße der ersten Ebene des Verzeichnisses erhalten möchten (d. H. Dateien, die unmittelbar darin enthalten sind).

Für mehr auf, warum ist dies nicht so einfach, wie man dachte, es wäre, finden Sie in diesem zeitlosen Beitrag von 2004: https://blogs.msdn.microsoft.com/oldnewthing/20041228-00/?p=36863

Verwandte Themen