Busco un ejemplo de Tree para directorios

Post Reply
jfafive
Posts: 396
Joined: Tue Mar 18, 2008 9:41 pm
Location: Marbella

Busco un ejemplo de Tree para directorios

Post 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?
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Javier,

Revisa samples\TestTree.prg
regards, saludos

Antonio Linares
www.fivetechsoft.com
jfafive
Posts: 396
Joined: Tue Mar 18, 2008 9:41 pm
Location: Marbella

Post by jfafive »

Ok Antonio, lo voy a revisar y te comento.

Un saludo.
jfafive
Posts: 396
Joined: Tue Mar 18, 2008 9:41 pm
Location: Marbella

Post 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? :(
jfafive
Posts: 396
Joined: Tue Mar 18, 2008 9:41 pm
Location: Marbella

Post by jfafive »

oK.
Creo que ya estoy en el camino.

gracias de todos modos Antonio.
:wink:
jfafive
Posts: 396
Joined: Tue Mar 18, 2008 9:41 pm
Location: Marbella

Post 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
jfafive
Posts: 396
Joined: Tue Mar 18, 2008 9:41 pm
Location: Marbella

Se bloquea el codigo solo con gran volumen

Post 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
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
jfafive
Posts: 396
Joined: Tue Mar 18, 2008 9:41 pm
Location: Marbella

Post 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
Post Reply