Busco un ejemplo de Tree para directorios

Busco un ejemplo de Tree para directorios

Postby jfafive » Thu May 22, 2008 5:28 pm

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

Postby Antonio Linares » Thu May 22, 2008 7:05 pm

Javier,

Revisa samples\TestTree.prg
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41289
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby jfafive » Thu May 22, 2008 8:18 pm

Ok Antonio, lo voy a revisar y te comento.

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

Postby jfafive » Thu May 22, 2008 8:37 pm

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

Postby jfafive » Thu May 22, 2008 9:24 pm

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

Postby jfafive » Thu May 22, 2008 10:30 pm

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  Expand view
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

Postby jfafive » Fri May 23, 2008 10:46 am

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

Postby Antonio Linares » Fri May 23, 2008 10:50 am

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

Postby jfafive » Fri May 23, 2008 11:10 am

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


Return to FiveWin para CA-Clipper

Who is online

Users browsing this forum: No registered users and 3 guests