File.walk în Kotlin

Fișiere (kotlin.io) Kotlin 1.0 (JVM)

Parcurge un director cu toate subdirectoarele și fișierele lui, ca o secvență de obiecte File.

Sintaxă
fun File.walk(direction: FileWalkDirection = FileWalkDirection.TOP_DOWN): FileTreeWalk
fun File.walkTopDown(): FileTreeWalk
fun File.walkBottomUp(): FileTreeWalk

Ce face File.walk

File("poze").walk() returnează o secvență care conține directorul însuși, toate subdirectoarele și toate fișierele, la orice adâncime. Pe ea poți aplica filter, map, count: de exemplu walk().filter { it.isFile && it.extension == "jpg" }.

Ordinea în care sistemul de fișiere dă intrările nu este garantată, deci sortează rezultatul dacă îl afișezi. Cu maxDepth(1) te oprești la primul nivel. walkBottomUp() dă întâi conținutul, apoi directorul, ordine utilă pentru ștergere.

Parametri

Parametru Descriere
direction TOP_DOWN (directorul înaintea conținutului, implicit) sau BOTTOM_UP.

Ce returnează

Un FileTreeWalk, adică o Sequence<File>.

Exemple

Exemplul 1: Toate fișierele dintr-un director

Creăm o mică structură, apoi listăm doar fișierele, sortate după cale.

import java.io.File

fun main() {
    File("vacanta/2024").mkdirs()
    File("vacanta/2025").mkdirs()
    File("vacanta/2024/mare.jpg").writeText("x")
    File("vacanta/2025/munte.jpg").writeText("xy")
    File("vacanta/2025/traseu.txt").writeText("Sinaia - Babele")
    File("vacanta").walk()
        .filter { it.isFile }
        .map { it.path }
        .sorted()
        .forEach { println(it) }
}

Rezultat

vacanta/2024/mare.jpg
vacanta/2025/munte.jpg
vacanta/2025/traseu.txt

Exemplul 2: Numărare și dimensiune totală după extensie

Grupăm fișierele după extensie și adunăm dimensiunile lor.

import java.io.File

fun main() {
    File("docs/vechi").mkdirs()
    File("docs/cv.pdf").writeText("a".repeat(300))
    File("docs/vechi/contract.pdf").writeText("b".repeat(500))
    File("docs/notite.txt").writeText("c".repeat(40))
    val peExtensie = File("docs").walk().filter { it.isFile }.groupBy { it.extension }
    for ((ext, fisiere) in peExtensie.toSortedMap()) {
        println("$ext: ${fisiere.size} fișiere, ${fisiere.sumOf { it.length() }} octeți")
    }
}

Rezultat

pdf: 2 fișiere, 800 octeți
txt: 1 fișiere, 40 octeți

Exemplul 3: Doar primul nivel cu maxDepth

Cu maxDepth(1) vedem directorul și conținutul lui direct, fără subdirectoarele adânci.

import java.io.File

fun main() {
    File("radacina/a/b/c").mkdirs()
    File("radacina/fisier.txt").writeText("1")
    val nivel1 = File("radacina").walk().maxDepth(1).map { it.name }.sorted().toList()
    val toate = File("radacina").walk().count()
    println(nivel1)
    println("Total intrări: $toate")
}

Rezultat

[a, fisier.txt, radacina]
Total intrări: 5

Greșeli frecvente

  • Uiți că primul element al lui walk este directorul însuși. Filtrează cu isFile când vrei doar fișiere.
  • Afișezi rezultatul nesortat și te miri că ordinea diferă de la un calculator la altul. Sortează după path.

Comenzi înrudite

  • File.extension: extension dă partea de după ultimul punct din numele fișierului; nameWithoutExtension dă numele fără ea.
  • File.copyTo: copyTo copiază un fișier în altă locație; deleteRecursively șterge un fișier sau un director cu tot conținutul.
  • sequence: Construiește o secvență dintr-un bloc de cod care dă valori una câte una cu yield; codul se oprește și continuă la cerere.