Page 1 of 1

Busco un ejemplo de Tree para directorios

Posted: Thu May 22, 2008 5:28 pm
by jfafive
Hola a todos!

Estoy intentando desarrollar una funcion tree para poder listar las carpetas y subcarpetas de una unidad a partir de un path.

¿alguien tiene algun ejemplo de tree?

Posted: Thu May 22, 2008 7:05 pm
by Antonio Linares
Javier,

Revisa samples\TestTree.prg

Posted: Thu May 22, 2008 8:18 pm
by jfafive
Ok Antonio, lo voy a revisar y te comento.

Un saludo.

Posted: Thu May 22, 2008 8:37 pm
by jfafive
Antonio,

Lo he estado mirando. Pero no se como me puede ayudar esto a sacar un arbol de directorios de c: por ejemplo.

No veo que tenga ningun metodo recursivo que valla explorando el path, o algo parecido a lo que hacia el TREE del msdos.

una ayudita? :(

Posted: Thu May 22, 2008 9:24 pm
by jfafive
oK.
Creo que ya estoy en el camino.

gracias de todos modos Antonio.
:wink:

Posted: Thu May 22, 2008 10:30 pm
by jfafive
Antonio, cuando ejecuto el siguiente codigo, mi aplicación se cuelga.

Pero si ejecuto el mismo codigo en un modulo de prueba, funciona bien.

:?:

Code: Select all

static function fPrueba( cPath )

local x
local aFiles    := directory( cPath + '\*.*', 'D' )
local nFilCount := len( aFiles )
local cTxt      := ""

for x := 1 to nFilCount
   if aFiles[ X, F_NAME ] <> '..'

      cMemo += cPath + aFiles[ X, F_NAME ] + CRLF

   endif

   if 'D' $ aFiles[ X, F_ATTR ]
      if aFiles[ X, F_NAME ] <> '.'
         fPrueba( cPath + '\' + aFiles[ X, F_NAME ]
      endif
   endif

next

return nil

Se bloquea el codigo solo con gran volumen

Posted: Fri May 23, 2008 10:46 am
by jfafive
Hola Antonio,

He optimizado el codigo y funciona bien mientras no sea un gran volumen de directorios. Por ejemplo, lo he probado con E: que es una estructura limitada.

Pero si le paso C:, se cuelga la aplicación.

No se por donde puede estar el fallo. A ver si me puedes ayudar. Aqui te muestro el codigo:

Code: Select all

static function fPrueba( cPath )

local x
local aFiles    := Iif( SubStr( AllTrim( cPath ), Len( cPath ), 1 ) = "\",;
                        directory( cPath + '*.*' , 'D' ),;
                        directory( cPath + '\*.*', 'D' ) )

local nFilCount := len( aFiles )

for x := 1 to nFilCount

    if 'D' $ aFiles[ X, F_ATTR ]
      if aFiles[ X, F_NAME ] <> '.'
         if SubStr( AllTrim( cPath ), Len( cPath ), 1 ) = "\"
            fPrueba( cPath + aFiles[ X, F_NAME ] )
         else
            fPrueba( cPath + '\' + aFiles[ X, F_NAME ] )
         endif
      endif
   endif

next

oGetMemo:cText += cPath + CRLF // := cDir
oGetMemo:Refresh()

return nil

Posted: Fri May 23, 2008 10:50 am
by Antonio Linares
Javier,

Prueba a hacer una llamada a SysRefresh() desde esa función para que Windows pueda ir procesando sus mensajes pendientes.

Comentarte que tienes la función cGetDir() que automaticamente te permite seleccionar un directorio, por si te sirve.

Posted: Fri May 23, 2008 11:10 am
by jfafive
Le he puesto el SysRefresh() y ya no se cuelga.

Pero tarda un buen rato en generar la lista.

Este es el ejemplo:

Code: Select all

static function fPrueba( cPath )

local x
local aFiles    := Iif( SubStr( AllTrim( cPath ), Len( cPath ), 1 ) = "\",;
                        directory( cPath + '*.*' , 'D' ),;
                        directory( cPath + '\*.*', 'D' ) )

local nFilCount := len( aFiles )

for x := 1 to nFilCount

      if 'D' $ aFiles[ X, F_ATTR ]
      if aFiles[ X, F_NAME ] <> '.'
         if SubStr( AllTrim( cPath ), Len( cPath ), 1 ) = "\"
            fPrueba( cPath + aFiles[ X, F_NAME ] )
         else
            fPrueba( cPath + '\' + aFiles[ X, F_NAME ] )
         endif
      endif
   endif

next

oGetMemo:cText += cPath + CRLF // := cDir
oGetMemo:Refresh()

SysRefresh()

return nil