/*
  SizeDir.c - von Christof Brühann
  Aufruf mit DICE: dcc SizeDir.c -o SizeDir
                   SizeDir <Verzeichnis>
*/

#include <libraries/dos.h>
#include <exec/memory.h>
ULONG size=0,numdirs=1,numfiles=0;

BOOL SizeDir(path)		/* Bestimmt die Größe eines Verzeichnisses */
UBYTE *path;			/* mit Unterverzeichnissen */
{
 UBYTE nxtpath[50];		/* Pfad für nächstes Unterverzeichnis */
 struct FileLock *lock;
 struct FileInfoBlock *fib;
 if (fib=(struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock),
                                          MEMF_PUBLIC)) /* Speicher für */
 {						    /* FileInfoBlock besorgen */
  if (lock=(struct FileLock *)Lock(path,ACCESS_READ)) /* Lock auf das zu */
  {					/* untersuchende Verzeichnis */
   if (Examine(lock,fib))		/* und nähere Informationen holen */
   {
    while (ExNext(lock,fib))		/* nächster Verzeichniseintrag */
    {
     numfiles++;			/* Zähler für Anzahl der Dateien */
     size+=fib->fib_Size;		/* Gesamtgröße erhöhen */
     if (fib->fib_DirEntryType>0)	/* Unterverzeichnis ? */
     {
      numfiles--;			/* wenn Unterverzeichnis, neuen Pfad */
      numdirs++;			/* erstellen und die Funktion */
      strcpy(nxtpath,path);		/* SizeDir() ein weiteres Mal */
      strcat(nxtpath,fib->fib_FileName);/* aufrufen */
      strcat(nxtpath,"/");
      SizeDir(nxtpath);
     }
    }
   }
   UnLock(lock);			/* Lock wieder freigeben*/
  }
  else return(FALSE);			/* Lock konnte nicht besorgt werden */
  FreeMem(fib,sizeof(struct FileInfoBlock));/* Speicher für FileInfo frei */
 }
 return(TRUE);
}

void main(argc,argv)
SHORT argc;
UBYTE **argv;
{
 UBYTE path[50];
 path[0]=0;
 if (argc>1)				/* Parameter vorhanden ? */
 {
  strcpy(path,argv[1]);
  printf("\nBestimme Größe vom Verzeichnis '%s'.\n\n",argv[1]);
  if (path[strlen(argv[1])-1]!=':') strcat(path,"/");
 }
 else printf("\nBestimme Größe vom aktuellen Verzeichnis.\n\n");
 if (SizeDir(path))			/* Hauptfunktion aufrufen */
 {					/* und Ergebnisse ausgeben */
  printf("%d Bytes wurden mit %d Dateien in %d Verzeichnis",size,numfiles,
         numdirs);
  if (numdirs>1) printf("sen");
  printf(" erreicht.\n\n");
 }
 else printf("Zugriff auf Verzeichnis '%s' nicht möglich.\n\n",argv[1]);
}
