DirectorySize

harja 12.07.03 23:48

DirectorySize - pieni esimerkki hakemistojen käsittelystä UNIX-puolella

 Tekstiversio  Arvo: 3 (4 ääntä)  Äänestä: +  -
#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;
}