#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/dir.h>#include <sys/stat.h>unsigned long long dirsiz (char *);void help ();void outull (unsigned long long);main (int a, char** v){ if (!--a) help (); ++v; int b; struct stat tmp; for (b=0;b<a;++b) { stat (v[b], &tmp); printf ("%s is ", v[b]); if (S_ISDIR (tmp.st_mode)) { printf ("a directory, size: "); outull (dirsiz (v[b])); } else if (S_ISREG (tmp.st_mode)) { printf ("a file, size: "); outull (tmp.st_size); } else printf ("is not a file!\n"); } putchar ('\n'); return 0;}void help (){ printf ("Usage: siz [file/dir name]\n"); exit (0);}unsigned long long dirsiz (char *fn){ DIR *di = opendir (fn); struct dirent *tmp; if (!di) exit (1); struct stat tp; unsigned long long ret=0; char tstr[256]; while (tmp = readdir (di)) { if (!strcmp (tmp->d_name, ".") || !strcmp (tmp->d_name, "..")) continue; strcpy (tstr, fn); strcat (tstr, "/"); strcat (tstr, tmp->d_name); stat (tstr, &tp); if (S_ISDIR (tp.st_mode)) ret += dirsiz (tstr); else ret += tp.st_size; } return ret;}void outull (unsigned long long var){ unsigned suffix=0; while (var>1024) { var /= 1024; ++suffix; } unsigned m = (unsigned) var; printf ("%d %sB\n", m, suffix==1?"K":suffix==2?"M":suffix==3?"G":suffix==4?"T":"");}