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.
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