home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / SPACE2.ZIP / SPACE.C next >
Text File  |  1991-06-13  |  7KB  |  222 lines

  1. #define INCL_ERRORS
  2. #include <os2.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. /* flags */
  7. BYTE fAccumDirSpace ;
  8. BYTE fLotusImport ;
  9. BYTE fVerbose ;
  10. BYTE fArchive ;
  11.  
  12. void PrintSpaceInfo (PSZ szDirectory, USHORT usFileCount, 
  13.                      double dDiskSpaceUsed, double dDiskSpaceAlloc)
  14.   {
  15.   if (!fLotusImport)
  16.     printf ("Directory ") ;
  17.   else
  18.     printf ("\"") ;
  19.   printf ("%s", szDirectory) ;
  20.   if (fVerbose)
  21.     printf (" has") ;
  22.   if (!fLotusImport)
  23.     printf ("\n  ") ;
  24.   else
  25.     printf ("\",") ;
  26.  
  27.   printf ("%d", usFileCount) ;
  28.   if (!fLotusImport)
  29.     printf (" file(s)") ;
  30.   if (fVerbose && fAccumDirSpace)
  31.     printf (" including subdirectory files") ;
  32.   if (!fLotusImport)
  33.     printf ("\n  ") ;
  34.   else
  35.     printf (",") ;
  36.  
  37.   printf ("%.2f", dDiskSpaceUsed) ;
  38.   if (!fLotusImport)
  39.     printf ("K used") ;
  40.   if (fVerbose)
  41.     printf (" by these files") ;
  42.   if (!fLotusImport)
  43.     printf ("\n  ") ;
  44.   else
  45.     printf (",") ;
  46.  
  47.   printf ("%.0f", dDiskSpaceAlloc) ;
  48.   if (!fLotusImport)
  49.     printf ("K allocated") ;
  50.   if (fVerbose)
  51.     printf (" by these files\n") ;
  52.  
  53.   printf ("\n") ;
  54.   }
  55.  
  56.  
  57. void SearchDir (PSZ szSearchSpec, USHORT *pusFileCount, 
  58.                 double *pdDiskSpaceUsed, double *pdDiskSpaceAlloc)
  59.   {
  60.   struct _FILEFINDBUF fbFile ;
  61.   HDIR   hDir ;
  62.   USHORT usCount ;
  63.   USHORT usRtrn ;
  64.   USHORT i ;
  65.   char szDirectory[256] ;
  66.   char szNewSearchSpec[256] ;
  67.   USHORT  usNewFileCount ;
  68.   double  dNewDiskSpaceUsed ;
  69.   double  dNewDiskSpaceAlloc ;
  70.  
  71.   /* Initialize accumulators */
  72.   *pusFileCount = 0 ;
  73.   *pdDiskSpaceAlloc = (float) 0.0 ;
  74.   *pdDiskSpaceUsed  = (float) 0.0 ;
  75.  
  76.   /* Identify the Directory name */
  77.   strcpy (szDirectory, szSearchSpec) ;
  78.   /* Find last backslash to signal end of direcotry spec and truncate string*/
  79.   for (i = strlen(szDirectory) - 1; i > 0 && szDirectory[i] != '\\'; --i)
  80.     ;
  81.   szDirectory [i] = 0 ;
  82.  
  83.   hDir = HDIR_CREATE ;
  84.   usCount = 1 ;
  85.  
  86.   /* Find the first file in the directory */
  87.   DosFindFirst (szSearchSpec, &hDir, 
  88.     FILE_NORMAL | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED, 
  89.     &fbFile, sizeof (fbFile), &usCount, 0L) ;
  90.   
  91.   /* while files in directory, find the next file */
  92.   do
  93.     {
  94.     /* if file is a directory call search routine */
  95.       if (fbFile.attrFile == FILE_DIRECTORY && 
  96.         (strcmp (fbFile.achName, ".") != 0 &&
  97.          strcmp (fbFile.achName, "..") != 0))
  98.       {
  99.       strcpy (szNewSearchSpec, szDirectory) ;
  100.       strcat (szNewSearchSpec, "\\") ;
  101.       strcat (szNewSearchSpec, fbFile.achName) ;
  102.       strcat (szNewSearchSpec, "\\*.*") ;
  103.       SearchDir ((PSZ) szNewSearchSpec, &usNewFileCount, 
  104.                  &dNewDiskSpaceUsed, &dNewDiskSpaceAlloc) ;
  105.  
  106.       PrintSpaceInfo((PSZ) szNewSearchSpec, usNewFileCount,
  107.                      dNewDiskSpaceUsed, dNewDiskSpaceAlloc) ;
  108.  
  109.       if (fAccumDirSpace)
  110.         {
  111.         *pusFileCount    += usNewFileCount ;
  112.         *pdDiskSpaceUsed += dNewDiskSpaceUsed ;
  113.         *pdDiskSpaceAlloc+= dNewDiskSpaceAlloc ;
  114.         }
  115.       }
  116.     else
  117.       /* If not a directory, accumulate the info */
  118.       if (strcmp (fbFile.achName, ".") != 0 &&
  119.           strcmp (fbFile.achName, "..") != 0)
  120.           {
  121.           if (!fArchive || fbFile.attrFile && FILE_ARCHIVED)
  122.             {
  123.             ++(*pusFileCount) ;
  124.             *pdDiskSpaceAlloc+= ((double) fbFile.cbFileAlloc)/1024 ;
  125.             *pdDiskSpaceUsed += ((double) fbFile.cbFile)/1024 ;
  126.             }
  127.           }
  128.     }
  129.   while ((usRtrn = DosFindNext (hDir,&fbFile,sizeof(fbFile),&usCount)) == 0) ;
  130.  
  131.   if (usRtrn != ERROR_NO_MORE_FILES)
  132.     printf ("Error looking for more files was %d\n", usRtrn) ;
  133.  
  134.   /* Close the search direcotry handle */
  135.   DosFindClose (hDir) ;
  136.   }
  137.  
  138. void Instructions (char *PgmName)
  139.   {
  140.   printf ("Finds the disk space used by all subdirectories, \n") ;
  141.   printf ("accumulates the subdirectory space usage in the parent count.\n");
  142.   printf ("USAGE: %s <drive>\n", PgmName) ;
  143.   printf ("       ex. %s C: - to find the space used by\n", PgmName) ;
  144.   printf ("                      directories on the c: drive\n") ;
  145.   printf ("             -or-\n") ;
  146.   printf ("           %s C:\TEST - to display information for all\n", PgmName) ;
  147.   printf ("                        subdirectories under c:\test\n") ;
  148.   printf ("FLAGS:\n") ;
  149.   printf ("  /A - count only files with archive bit turned on\n") ;
  150.   printf ("  /a - accumulate file count, space used and apce allocated when\n") ;
  151.   printf ("       traversing subdirectories.\n") ;
  152.   printf ("  /l - Display output in Lotus import format.\n") ;
  153.   printf ("  /v - Output is verbose\n") ;
  154.   }
  155.  
  156. void main (int argc, char *argv[])
  157.   {
  158.   char    szSearchSpec[256] ;
  159.   USHORT  usFileCount ;
  160.   double  dDiskSpaceUsed ;
  161.   double  dDiskSpaceAlloc ;
  162.   USHORT  i ;
  163.  
  164.   /* Parse command line arguments */
  165.   if (argc < 2)
  166.     Instructions (argv[0]) ;
  167.   else
  168.     {
  169.     /* Initialize flags */
  170.     fAccumDirSpace = FALSE ;
  171.     fLotusImport   = FALSE ;
  172.     fVerbose       = FALSE ;
  173.     fArchive       = FALSE ;
  174.  
  175.     /* Parse command line */
  176.     for (i = 1; i < argc; ++i)
  177.       if (argv[i][0] == '/' || argv[i][0] == '-')
  178.         switch (argv[i][1])
  179.           {
  180.           case 'A' :
  181.             printf ("Only Archive files will be counted\n") ;
  182.             fArchive = TRUE ;
  183.             break ;
  184.           case 'a' :
  185.             printf ("Data is accumulated through all subdirectories\n") ;
  186.             fAccumDirSpace = TRUE ;
  187.             break ;
  188.           case 'L' :
  189.           case 'l' :
  190.             printf ("Displaying in Lotus Import format\n") ;
  191.             fLotusImport  = TRUE ;
  192.             break ;
  193.           case 'V' :
  194.           case 'v' :
  195.             printf ("Verbose output\n") ;
  196.             fVerbose = TRUE ;
  197.             break ;
  198.           }
  199.       else
  200.         strcpy (szSearchSpec, argv[i]) ;
  201.  
  202.     strupr (szSearchSpec) ;
  203.     /* Search for all files */
  204.     strcat (szSearchSpec, "\\*.*") ;
  205.  
  206.     printf ("\n") ;
  207.  
  208.     if (fLotusImport)
  209.       {
  210.       printf ("\"         \",\"         \",\"Space     \",\"Space        \"\n") ;
  211.       printf ("\"Directory\",\"Num Files\",\"Used in K \",\"Allocated in K\"\n") ;
  212.       }
  213.  
  214.     /* Search the directory for files */
  215.     SearchDir (szSearchSpec, &usFileCount, 
  216.                &dDiskSpaceUsed, &dDiskSpaceAlloc) ;
  217.  
  218.     PrintSpaceInfo ((PSZ) szSearchSpec, usFileCount,
  219.                     dDiskSpaceUsed, dDiskSpaceAlloc) ;
  220.     }
  221.   }
  222.