*!* Ejemplificacion de la funcion ADIR() *!* Ultima revisión: 20/09/2002 *!* Alberto Rodriguez - JARSoft - Argentina *!* jarargentina@hotmail.com *!* -------------------------------------------- *!* Uso de adir en el rastreo de archivos y directorios de un disco *!* o carpeta (ej 4) *!* Determinar la profundidad de los subdirectorios encontrados. (ej 2) *!* -------------------------------------------- *!* -------------------------------------------- If Val(Left(Version(4),2)) < 7 Messagebox("Escrito para la version 7.00 o superior. "+; "Analizar el codigo antes de correr.",16,"") Return Endif Set Talk Off Set Escape On Set Notify On Close All Clear All Clear Local cFontAntes cFontAntes = _Screen.FontName _Screen.FontName="FOXPRO WINDOWS FONT" ? Private cDir Wait Window Nowait ; 'Seleccione un directorio (o unidad)'+Chr(13)+Chr(10)+; '(sugiero una unidad o un directorio que tenga varios '+; 'subdirectorios y archivos .TXT...)' cDir = Getenv('windir') If !Directory(cDir) cDir = 'C:\Archivos de programa' If !Directory(cDir) cDir = Sys(5)+'\' Endif Endif cDir = Getdir(cDir) If !Empty(cDir) And Directory(cDir) Wait Window Nowait "Buscando en: "+cDir+", espere..." ?"Buscando en: "+cDir *!* -------------------------------------------- *- Ejemplo nro 1 ListarDirectorios() ? Wait Wind *!* -------------------------------------------- *- Ejemplo nro 2 Wait Window Nowait Noclear "Buscando en: "+cDir+", espere..." ListarSubCarpetas(cDir) ? Wait 'SubCarpetas del directorio elegido (o unidad)' *!* -------------------------------------------- *- ejemplo 3 Wait Window Nowait Noclear 'Escriba un nombre de archivo a buscar...' cNombFileaBuscar = Inputbox("nombre del archivo a buscar", "", "readme.txt") If !Empty(cNombFileaBuscar) nnnn = BuscarArchivoExacto(cDir, cNombFileaBuscar, .F.) ?"Archivos encontrados: ", nnnn ? Else Return Endif Wait 'Archivo encontrado en...' *!* -------------------------------------------- *- ejemplo 4 cExtencionaB = Inputbox("Ingrese EXTENCION a buscar", "", "TXT") nnnn = BuscarExtenciondeArchivo(cDir, cExtencionaB) ?"Archivos encontrados: ", nnnn ? ? Wait "Fin del ejemplo, ..." ? Endif _Screen.FontName = cFontAntes *- fin. Procedure ListarDirectorios *- listar directorios del primer nivel un disco *- o subdirectorios de una carpeta Local x, nSon, nListados nListados = 0 Wait Window Nowait ; 'Listar directorios del primer nivel de un disco o '+; 'subdirectorios de una carpeta' nSon = Adir(aArchivos, cDir+"*.*", "D") If nSon > 0 =Asort(aArchivos,1) For x=1 To nSon If !("D"$aArchivos[x,5]) Or ; aArchivos[x,1] == "." Or aArchivos[x,1] == ".." Loop Endif ?"Nombre: ", Lower(aArchivos[x,1]) ??" Tamaño: ", aArchivos[x,2] ??" Fecha: ", aArchivos[x,3] ??" Hora: ", aArchivos[x,4] ??" Atributo: ", aArchivos[x,5] nListados = nListados + 1 Next Else *- Esta opcion no deberia ejecutarse nunca ya que siempre hay *- al menos dos . y .. aunque no haya archivos. ?"No hay Directorios en "+cDir Endif If nListados > 0 ?nListados, 'directorios del primer nivel listados.' *- a partir de ahroa si se quiere acceder a la ruta completa *- de algún directorio no hay mas que sumar: addbs(cDir + '\' +aArchivos[n,1]) Else ?"No hay Directorios en "+cDir Endif Release aArchivos Endproc Procedure ListarSubCarpetas Lparameters lpcDirectorio, lplNoMostrarResultados *- listar todos los niveles de subcarpetas *- si elijio el disco raiz listará todos los subdirectorios del disco con *- todos los subdirectorios contenidos en ellos. *- (o sea recorrerá el disco completo -esto puede llevar tiempo en un disco *- grande-) *- Este procedimiento requiere recursividad. Local x, nSon, nNivel nNivel = 0 Dimension aTodaslasCarpertas[1,2] BuscarSubDir(lpcDirectorio, @aTodaslasCarpertas, @nNivel) nSon = Alen(aTodaslasCarpertas, 1) Wait Clear If !lplNoMostrarResultados *- Nota: Esto es un ejemplo, no es la mejor forma de scan de directorios *- en este ejemplo, primero se recorre y luego se muestra, dividiendo las *- tareas... Lento!! como compilador de dos pasadas... :)))) *- Pero el objetivo es mostrar el uso de Adir. For x=2 To nSon ?"Nombre: ", Displaypath(aTodaslasCarpertas[x,1], 60) ??" ,Nivel: ", aTodaslasCarpertas[x,2] If x > 50 ? ?'Bueno, listo, para muestra basta un boton..., hay ',nSon,' para listar.' Exit Endif Next Endif Endproc Procedure BuscarSubDir Parameters lpcDir, aResultDir, vnNivel *- procedimiento recursivo vnNivel = vnNivel + 1 Local x, nSon Private aArchivos nSon = Adir(aArchivos, lpcDir+"*.*", "D") For x=1 To nSon If "D"$aArchivos[x,5] If aArchivos[x,1] == "." Or aArchivos[x,1] == ".." Loop Endif Dimension aResultDir[ALEN(aResultDir,1)+1,2] aResultDir[ALEN(aResultDir,1),1] = Addbs(lpcDir+aArchivos[x,1]) aResultDir[ALEN(aResultDir,1),2] = vnNivel BuscarSubDir(Addbs(lpcDir+aArchivos[x,1]), @aResultDir, vnNivel) Endif Next Endproc Procedure BuscarArchivoExacto *- podemos usar estas funciones para buscar un archivo en disco. Lparameters lpcDir, lpcNombre, lplDetenerSiEncuentra *- lpcDir: carpeta o drive en donde buscar *- lpcNombre: nombre del archivo con su extencion si la tuviera *- lplDetenerSiEncuentra: buscar todos los archivos repetidos o el primero que encuentre. *- Esta funcion devuelve la cantidad de archivos encontrados. ... Local nSon, x, nEncontrados, Y, nArch Local omostrar omostrar = Createobject("MostrarResultados") If Type("omostrar") # "O" Messagebox("ups!",16,"") Cancel Endif omostrar.Show() nEncontrados = 0 lpcNombre = Upper(Alltrim(lpcNombre)) Dimension aTodaslasCarpertas[1,2] ListarSubCarpetas(lpcDir, .T.) *- este directorio aTodaslasCarpertas[1,1] = lpcDir aTodaslasCarpertas[1,2] = 0 nSon = Alen(aTodaslasCarpertas, 1) *- buscar en los directorios For x=1 To nSon omostrar.label1.Caption = "Buscando ahora en: "+; DISPLAYPATH(aTodaslasCarpertas[x,1],60)+"..." nArch = Adir(aFiles, aTodaslasCarpertas[x,1]+"*.*", "AHRSD") For Y=1 To nArch If "D"$aFiles[y,5] Or aFiles[y,1] == "." Or aFiles[y,1] == ".." Loop Endif If Upper(aFiles[y,1]) == lpcNombre nEncontrados = nEncontrados + 1 omostrar.list1.AddItem("Encontrado en: "+; Displaypath(aTodaslasCarpertas[x,1]+ aFiles[y,1], 60)) If lplDetenerSiEncuentra Exit Endif Endif Next If nEncontrados > 0 And lplDetenerSiEncuentra Exit Endif Next Clear Typeahead Wait Clear Wait Wind Return nEncontrados Endproc Procedure BuscarExtenciondeArchivo *- podemos usar estas funciones para buscar un archivo en disco. *- buscar todos los archivos cuya extencion sea igual a ... Lparameters lpcDir, lpcExtencion *- lpcDir: carpeta o drive en donde buscar *- lpcExtencion: Extencion de archivo (sin el punto) *- Esta funcion devuelve la cantidad de archivos encontrados. ... Local nSon, x, nEncontrados, Y, nArch Local omostrar omostrar = Createobject("MostrarResultados") If Type("omostrar") # "O" Messagebox("ups!",16,"") Cancel Endif omostrar.Show() nEncontrados = 0 lpcExtencion = Upper(Alltrim(lpcExtencion)) Dimension aTodaslasCarpertas[1,2] Wait Window Nowait Noclear 'Espere...' ListarSubCarpetas(lpcDir, .T.) *- este directorio aTodaslasCarpertas[1,1] = lpcDir aTodaslasCarpertas[1,2] = 0 nSon = Alen(aTodaslasCarpertas, 1) *- buscar en los directorios For x=1 To nSon omostrar.label1.Caption = "Buscando ahora en: "+; DISPLAYPATH(aTodaslasCarpertas[x,1],60)+"..." nArch = Adir(aFiles, aTodaslasCarpertas[x,1]+"*.*", "AHRSD") For Y=1 To nArch If "D"$aFiles[y,5] Or aFiles[y,1] == "." Or aFiles[y,1] == ".." Loop Endif If Upper(Justext(aFiles[y,1])) == lpcExtencion nEncontrados = nEncontrados + 1 omostrar.list1.AddItem("Encontrado en: "+; DISPLAYPATH(aTodaslasCarpertas[x,1] + aFiles[y,1],60)) Endif Next Next Wait Clear Clear Typeahead Wait Wind Return nEncontrados Endproc *- alguna interface sencilla para mostrar resultados Define Class MostrarResultados As Form AutoCenter = .T. Width = 640 Height = 380 Add Object label1 As Label With ; AutoSize = .T., ; Left = 5, ; Top = 10, ; TabIndex = 1 Add Object list1 As ListBox With ; Left = 5, ; Top = 30, ; width = 630, ; height = 300, ; ItemTips = .T.,; TabIndex = 2 Enddefine
Alberto Rodriguez
Este ejemplo vale oro... Gracias Alberto Rodriguez - JARSoft por publicarlo.
ResponderBorrarMe sirvió de mucho. Soy un estudiante de programación en la Universidad de la Calle y no sabía como hacer esto.
Gracias porque aún existen personas desinteresadas que comparten sus experiencias y conocimientos.
NO al egoismo...