Listar directorios con Kotlin

Recorrer y listar los directorios ubicados en la jerarquía de la ruta actual es relativamente sencillo, esto se debe a que Kotlin es 100% interoperable con Java pero al mismo tiempo extiende sus clases para agregarle mayor funcionalidad. Aquí está la forma de como hacer esto en solo 16 líneas de código.



Descripción: este pequeño programa va a recorrer los directorios en la jerarquía de la ruta actual, los va a listar e irá contando los directorios que va encontrando en su recorrido, ese conteo sera acumulado.

/*
* Created by fixedtorres.
*/

package listDirectorios

import java.io.File

fun main(Args: Array<String>) {
    var numDirs = 0

    File(".").walkTopDown().forEach { when {
            it.isDirectory -> { println(it)
                numDirs++
            }
        }
    }
    println("\nNumero de directorios encontrados: ${numDirs}")
}

En Kotlin la sentencia package es opcional; pero es recomendado usar dicha sentencia asignando un nombre de paquete al archivo fuente cuando se trabaja en programas más grandes que serán divididos en diferentes archivos con el fin de facilitar la importación desde otros archivos fuente. En este caso lo he puesto para explicar esta parte ya que no es necesario por ser un pequeño programa.

Importando la clase File():
import java.io.File

Como ya se dijo antes, Kotlin es 100% compatible e interoperable con Java, esto nos permite usar todas las clases que están en su biblioteca. Para usar alguna clase solo basta con importarla usando la palabra clave import seguida del nombre de la clase, en este caso es la clase File() como se observa aquí; pero si queremos usar todas las clases, métodos y funciones en dicho paquete, solo debemos poner un * al final de la linea asi: java.io.*

Función main():
fun main(Args: Array<String>) {
    /* Bloque de codigo a ejecutar */
}

Al igual que otros lenguajes como C, C++ y Go, en el lenguaje de programación Kotlin es obligatoria la función main(); es la única función que se ejecuta de forma automática cuando el programa se ejecuta, el código que se encuentre en su interior sera el unico que se ejecutará.

Clase File() + función .walkToDown() + .forEach {..} = listando directorios:

Kotlin no solo puede hacer uso de la clase File() y a los diferentes métodos predefinidos por Java, sino que tambien extiende dicha clase mediante funciones, añadiendo más características con mayor funcionalidad.

var numDirs = 0

File(".").walkTopDown().forEach { when {
        it.isDirectory -> { println(it)
            numDirs++
        }
    }
}
println("\nNumero de directorios encontrados: ${numDirs}")

Al inicio hice una breve descripción de lo que hace este programa, ahora explicare como se compone y cómo funciona el fragmento de código que hace el trabajo tras bambalinas. En la primera línea se crea una variable llamada numDir usando inferencia de tipos iniciándose con un valor de 0; en esta variable se va a almacenar el conteo del número de directorios que se encuentran en la jerarquía de la ruta actual.

La clase File() nos permite trabajar sobre rutas de directorios y archivos, recibe como argumento un string que representa la ruta del directorio, el nombre del archivo sobre el cual vamos a trabajar o en caso contrario el nombre del archivo que deseamos a crear; en este caso usamos un «.» ya que vamos a recorrer la jerarquía de la ruta actual iniciando desde la ruta proporcionada a File() de forma descendente; por ejemplo: «.», «./», «./directorio1», «./directorio1/subdir1», «../../../..».

Función .walkTopDown():

Esta función no está entre los métodos predefinidos por Java en para la clase File(), es una extensión propia de Kotlin y obtiene una secuencia que nos permite iterar sobre la ruta actual y todo su contenido interno de forma descendente. Si utilizamos la función .walkTopDown() junto con la función .toLis():

var drs = File(".").walkTopDown().toList()
println(drs)

Nos devuelve dicha secuencia convertida en una lista legible para el humano que puede ser recorrida con un bucle for(), while(), do … while() o una función .forEach {}; así se ve la lista en este caso:

[., ./src, ./src/Compilando.kt, ./src/tablas.html, ./laboratoriosKotlin.iml, ./.idea, ./.idea/misc.xml, ./.idea/libraries, ./.idea/libraries/KotlinJavaRuntime.xml, ./.idea/workspace.xml, ./.idea/modules.xml, ./.idea/kotlinc.xml, ./out, ./out/production/laboratoriosKotlin/tablas.html, ./out/production/laboratoriosKotlin/numeroprimo, ./out/production/laboratoriosKotlin/numeroprimo/CompilandoKt.class, ./out/production/laboratoriosKotlin/listDirectorios, ./out/production/laboratoriosKotlin/listDirectorios/CompilandoKt.class, ./out/production/laboratoriosKotlin/META-INF, ./out/production/laboratoriosKotlin/META-INF/laboratoriosKotlin.kotlin_module]
Función .forEach {…}:

Esta función tampoco forma parte de los métodos predefinidos en Java, sino que es una función propia de Kotlin y forma parte de lo que se conoce como funciones de orden superior, es un iterador de secuencia de elementos o rangos; su tarea en este caso es recorrer la secuencia generada por la función .walkTopDown(). Hay una sentencia when encargada de evaluar si cada elemento es un directorio y dependiendo de esto, se imprimirá el nombre del directorio más su ruta y por último se incrementa la variable numDirs en 1.



Compilando y ejecutando nuestra aplicación:

Según el directorio en donde se ejecute nuestra aplicación, nos produce un resultado como el siguiente:

[fixedtorres@linuxero]$ kotlinc -include-runtime ListDirs.kt -d ListDirs.jar
[fixedtorres@linuxero]$ kotlin ListDirs.jar
.
./laboratorioGroovy
./laboratorioGroovy/src
./laboratorioGroovy/.idea
./laboratorioGroovy/.idea/inspectionProfiles
./laboratorioGroovy/out
./laboratorioGroovy/out/production
./laboratorioGroovy/out/production/laboratorioGroovy
./DjProjects
./DjProjects/mipunto
./DjProjects/.idea
./laboratorioPython
./laboratorioPython/src
./laboratorioPython/.idea
./laboratoriosKotlin
./laboratoriosKotlin/src
./laboratoriosKotlin/.idea
./laboratoriosKotlin/.idea/libraries
./laboratoriosKotlin/out
./laboratoriosKotlin/out/production
./laboratoriosKotlin/out/production/laboratoriosKotlin
./laboratoriosKotlin/out/production/laboratoriosKotlin/numeroprimo
./laboratoriosKotlin/out/production/laboratoriosKotlin/listDirectorios
./laboratoriosKotlin/out/production/laboratoriosKotlin/META-INF
./LaboratorioJava
./LaboratorioJava/src
./LaboratorioJava/.idea
./LaboratorioJava/out
./LaboratorioJava/out/production
./LaboratorioJava/out/production/LaboratorioJava

Numero de directorios encontrados: 31
[fixedtorres@linuxero]$

Una lista ordenada de forma descendente (como se explicó al inicio) de todos los directorios con su ruta en la jerarquía de la ruta actual, iniciando desde la raíz «.». Al final de la lista de directorios se muestra un mensaje indicando el número de directorios encontrados.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *