| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
DirectorySizeharja 12.07.03 23:48 DirectorySize - pieni esimerkki hakemistojen käsittelystä UNIX-puolella
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <dirent.h> #define VERSION "1.0" int level=0, recursive=0, clev=0, verbose=0; unsigned long total_bytes=0; const char *prop[5]={"-","\\","|","-","/"}; const char *usage="usage: ds [-rhvVkm] -l=n {filename}\n"; /* Perusspinneri */ void spin(void) { static int spin_pos=0; spin_pos++; if(spin_pos>4) spin_pos=0; printf("%s\b", prop[spin_pos]); } /* Laskee hakemiston koon dname-hakemistolle */ void calculate(const char *dname) { DIR *dir; struct dirent *ent; struct stat sta; char newdirname[1024]; char shit[1024]; /* Avaa hakemisto */ if((dir=opendir(dname))==NULL) return; /* Käy läpi entryt */ while((ent=readdir(dir))) { if(!strcmp(ent->d_name, "..")||!strcmp(ent->d_name,".")) continue; sprintf(shit, "%s%s", dname, ent->d_name); stat(shit, &sta); /* Onko kyseessa hakemisto (ei linkki)? */ if((sta.st_mode&S_IFDIR)&&((sta.st_mode&S_IFLNK)==0)) { if(level>0) { if(clev>=level) continue; clev++; } sprintf(newdirname,"%s%s/", dname, ent->d_name); if(verbose) printf("%s\n",newdirname); calculate(newdirname); } else total_bytes+=sta.st_size; if(!verbose) spin(); } clev=0; closedir(dir); } int main(int argc, char *argv[]) { int i=0, divider=1024; if(argc<2) { printf("%s",usage); return 0; } for(i=1;i<argc&&argv[i][0]=='-';i++) { switch(argv[i][1]) { case 'r': recursive=1; break; case 'l': level=argv[i][3]-'0'; printf("level: %d\n", level); break; case 'h': printf("%s",usage); return 0; case 'v': verbose=1; printf("Verbose mode on.\n"); break; case 'V': printf("version: %s\n", VERSION); return 0; case 'k': divider=1024; break; case 'm': divider=1024*1024; break; default: break; } } printf("Calculating... "); calculate(argv[i]); printf("\nTotal size of the directory was: %ld %sbytes\n",total_bytes/divider,divider==1024?"kilo":"mega"); return 0; } |
![]() Haku
|