FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para CA-Clipper Busco un ejemplo de Tree para directorios
Posts: 396
Joined: Tue Mar 18, 2008 09:41 PM
Busco un ejemplo de Tree para directorios
Posted: Thu May 22, 2008 05: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?

Javier,

FWH 8.04 2008
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Busco un ejemplo de Tree para directorios
Posted: Thu May 22, 2008 07:05 PM

Javier,

Revisa samples\TestTree.prg

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 396
Joined: Tue Mar 18, 2008 09:41 PM
Busco un ejemplo de Tree para directorios
Posted: Thu May 22, 2008 08:18 PM

Ok Antonio, lo voy a revisar y te comento.

Un saludo.

Javier,

FWH 8.04 2008
Posts: 396
Joined: Tue Mar 18, 2008 09:41 PM
Busco un ejemplo de Tree para directorios
Posted: Thu May 22, 2008 08: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? :(

Javier,

FWH 8.04 2008
Posts: 396
Joined: Tue Mar 18, 2008 09:41 PM
Busco un ejemplo de Tree para directorios
Posted: Thu May 22, 2008 09:24 PM

oK.
Creo que ya estoy en el camino.

gracias de todos modos Antonio.

:wink:

Javier,

FWH 8.04 2008
Posts: 396
Joined: Tue Mar 18, 2008 09:41 PM
Busco un ejemplo de Tree para directorios
Posted: 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.

:-)

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
Javier,

FWH 8.04 2008
Posts: 396
Joined: Tue Mar 18, 2008 09:41 PM
Se bloquea el codigo solo con gran volumen
Posted: 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:

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
Javier,

FWH 8.04 2008
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Busco un ejemplo de Tree para directorios
Posted: 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
Posts: 396
Joined: Tue Mar 18, 2008 09:41 PM
Busco un ejemplo de Tree para directorios
Posted: 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:

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
Javier,

FWH 8.04 2008

Continue the discussion