No se si alguien tenga el código mejorado, pero para mis necesidades me es suficiente, ya que busque en el foro y no encontre me dedique unas horas a hacer pruebas y se las comparto:
- Code: Select all Expand view
- #INCLUDE "DIRECTRY.CH"
STATIC aTree:= {}
#IfNDef __XHARBOUR__
FUNCTION DbSkipper( n ) ; RETURN __DbSkipper( n )
FUNCTION DBPACK() ; RETURN __DbPack()
FUNCTION DBZAP() ; RETURN hb_DBZap()
FUNCTION CurDrive( x ) ; RETURN hb_CurDrive( x )
#EndIf
FUNCTION Main()
ArbolDir("C:\WINDOWS\Help") //Puede ser "C:" o un directorio: "C:\Windows"
RETURN Nil
//------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION ArbolDir(cDir)
LOCAL cletra:= UPPER(cDir)
LOCAL aDirs:= DirTree(cletra)
LOCAL N
IF LEN(aDirs) > 0
FOR N:= 1 TO LEN(aDirs)
MSGInfo("Direcorio: " + aDirs[N],"Origen: "+ cFilePath(aDirs[N]))
NEXT
MSGInfo(ALLTRIM(STR(LEN(aDirs)))+" Carpetas Encontrados", "DIRTREE")
ELSE
MSGStop("Disco "+cletra+" no Válido o Vacio", "DIRTREE")
ENDIF
RETURN Nil
//------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION DirTree(cDir)
LOCAL aSubDirs,nLen,i
aSubDirs:= GetTreeSubDirs(DIRECTORY(cDir+"\*.*","D"),cDir)
nLen:= LEN(aSubDirs)
IF nLen > 0
FOR I:= 1 TO nLen
AADD(aTree,aSubDirs[I])
CURDRIVE(LEFT(aSubDirs[I],1))
CURDIR(aSubDirs[I])
DirTree(aSubDirs[I])
NEXT
ENDIF
RETURN aTree
//------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION GetTreeSubDirs(aDirs,cDir)
LOCAL N
LOCAL nLen:= LEN(aDirs)
LOCAL aDirVal:= {}
IF nLen > 0
FOR N:= 1 TO nLen
IF AT("D",aDirs[N,F_ATTR]) > 0 .AND. LEFT(aDirs[N,F_NAME],1)#"."
AADD(aDirVal,cDir+"\"+aDirs[N,F_NAME])
ENDIF
NEXT
ENDIF
RETURN aDirVal
Optimizaciones, opiniones y/o mejoras son bienvenidas..