Función que devuelve el tamaño de un directorio y sus subdirectorios en bytes, KB, megas ….., según el parámetro pasado

// Resumen: Devuelve el tamaño del contenido de un directorio 
// y todos sus subdirectorios
//
// Sintaxis:
//[ <Result> = ] gfSizeFolder (<pcDirectorio> is string 
//       [, <pcTipeReturn> is string [, <sError> is string]])
//
// Parámetros:
//            pcDirectorio (ANSI string): Ruta <root> del 
//                         directorio a tratar
//            pcTipeReturn (ANSI string - valor 
//                         predeterminado="B"):
//                         Devolver el valor como: B (defecto)
//                         , KB, MB, GB, TB, PB, EB
//            sError (ANSI string - valor predeterminado=""): 
//                         Si se produce un error, se devuelve 
//                         el mensaje del error
// Valor de retorno:
//            numeric: Un valor correspondiente al parámetro 
/7                         "pcTipeReturn" o -1 si ocurre un error
//
// Ejemplo:
//            gfSizeFolder("c:\temp","MB")
//
PROCEDURE gfSizeFolder(LOCAL pcDirectorio is string, 
       LOCAL pcTipeReturn is string = "B", 
       LOCAL sError is string = "")

//*---------------------------------------------------------------
//*
//* Devuelve el tamaño del directorio pasado como parámetro (y 
//*         subdirectorios)
//*         NOTA: if ocurre Error, devuelve -1
//*
//*         Exabyte (EB)
//*         Petabyte (PB)
//*         Terabyte (TB)
//*         Gigabyte (GB)
//*         Megabyte (MB)
//*         Kilobyte (KB)
//*         byte (B)
//*
//*---------------------------------------------------------------
lnSizeBytes, lnSizeReturn are numeric


WHEN EXCEPTION IN

     lnSizeBytes         = fDirSize(pcDirectorio)

              
     // Si ha ocurrido un error

     IF ErrorOccurred THEN

           // Lanzamos la excepción para capturar el error

           ExceptionThrow(1,ErrorInfo(errMessage))

     END

     
     SWITCH pcTipeReturn

           CASE "KB"

                 lnSizeReturn = lnSizeBytes / 1024
           CASE "MB"

                 lnSizeReturn = lnSizeBytes / (1024^2)
           CASE "GB"

                 lnSizeReturn = lnSizeBytes / (1024^3)
           CASE "TB"

                 lnSizeReturn = lnSizeBytes / (1024^4)
           CASE "PB"

                  lnSizeReturn = lnSizeBytes / (1024^5)
           CASE "EB"

                   lnSizeReturn = lnSizeBytes / (1024^6)
           OTHER CASE

                  lnSizeReturn = lnSizeBytes

      END

DO
     lnSizeReturn = -1
     sError = ExceptionInfo(errMessage)
END

RESULT (lnSizeReturn)