DIRTREE Arbol de solo Directorios
Posted: Sat Aug 03, 2013 2:55 am
Pues eso, necesitaba una función que me permitiera tener en una DBF un Arbol de solo Directorios o DIRTREE, con DirectoryRecurse() obtenemos todos los archivos y solo carpetas que contiene archivos, Directory() obtiene todos los archivos y directorios, con o sin archivos, pero para poder acceder a todas las ramas del disco habia que hacer mucho codigo.
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:
Optimizaciones, opiniones y/o mejoras son bienvenidas..
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..