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
isFilecâ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.