Comunidad Gambas-es

Versión completa: Averiguar el tamaño de un directorio desde Gambas
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas!.

Tenemos el método size de la clase Stat. Pero eso no da el tamaño de un directorio, nos da el de un archivo.
¿ No existe en Gambas esa posibilidad ?. Sin tener que hacer uso del comando "du" desde Shell.

¿ Un procedimiento recursivo que vaya sumando el tamaño de cada archivo ?.

Saludos
Partiendo de este ejemplo:

GAMBAS
  1. Public Function ScanDir(sDir As String) As Long
  2.  
  3.    Dim sFile As String
  4.    Dim sPath As String
  5.    Dim hStat As Stat
  6.    Dim aDir As String[]
  7.    Dim iSize As Long
  8.  
  9.    Try hStat = Stat(sDir)
  10.    iSize = hStat.Size
  11.    If hStat.Type <> gb.Directory Then Return iSize
  12.    Try aDir = Dir(sDir)
  13.  
  14.    For Each sFile In aDir
  15.  
  16.      sPath = sDir &/ sFile
  17.      Try hStat = Stat(sPath)
  18.  
  19.      With hStat
  20.        If .Type = gb.Directory Then
  21.          Try iSize += ScanDir(sPath)
  22.        Endif
  23.        Try iSize += .Size
  24.      End With
  25.    Next
  26.    Return iSize
  27.  



Se encuentra en la lista internacional.

Saludos
Eh, sì... tendrás que usar la función "Dir()".
(07-03-2021, 12:22)Shell escribió: [ -> ]Sin tener que hacer uso del comando "du" desde Shell.

Pues si, lo unico que se me ocurre es eso, usar du.
Bash
  1. du --summarize ~/UnDirectorio/


Saludos.
¿Ayudará esto?
 

GAMBAS
  1.  
  2. Public Sub Form_Open()
  3.  
  4.   Print ScanDir(User.Home)
  5.  
  6.  
  7. Public Sub ScanDir(sPath As String) As String
  8.  
  9.   Dim sFile As String
  10.   Dim lSize As Long
  11.  
  12.   For Each sFile In Dir(sPath, "*", gb.File)
  13.     lSize += Stat(sPath &/ sFile).Size
  14.   Next
  15.  
  16.   Return sPath & " = " & Format(lSize / 1000000, "0.0") & "MB"
  17.  


(09-03-2021, 17:39)cogier escribió: [ -> ]¿Ayudará esto?


Sólo funciona si dentro de un directorio sólo hay ficheros. Si hay varios niveles de directorios y subdirectorios, creo que no va a funcionar. Tendría que ser una función recursiva que vaya entrando en cada subdirectorio, sumando tamaños y regresando a la raíz para continuar con el siguiente. 

Saludos
(09-03-2021, 22:08)jguardon escribió: [ -> ]Sólo funciona si dentro de un directorio sólo hay ficheros. Si hay varios niveles de directorios y subdirectorios, creo que no va a funcionar. Tendría que ser una función recursiva que vaya entrando en cada subdirectorio, sumando tamaños y regresando a la raíz para continuar con el siguiente. 

En primer lugar, ¡bienvenido!
Simplemente cambia 'Dir' por 'RDir'. Eso escaneará todos los subdirectorios.
(13-03-2021, 18:24)cogier escribió: [ -> ]Simplemente cambia 'Dir' por 'RDir'. Eso escaneará todos los subdirectorios.

Wow, no conocía la función recursiva RDir. Genial!!!!

Muchas gracias, cogier
(09-03-2021, 17:39)cogier escribió: [ -> ]¿Ayudará esto?

Gracias Charlie.

Lo pruebo y comento.

Saludos