Kotlin – Iterate through All Files in a Directory Recursively
In Kotlin, you can iterate through all files in a directory recursively by using the java.io.File extension functions walk(), walkTopDown(), and walkBottomUp(). These functions return kotlin.io.FileTreeWalk, which lets you traverse a directory tree and process each file or directory one by one.
This tutorial shows how to list files recursively, how the traversal order changes with each function, how to print only files and skip directories, and how to filter files by extension while walking through subdirectories.
Kotlin FileTreeWalk Functions for Recursive Directory Traversal
We shall use the extension functions of java.io.File : walk(), walkBottomUp, walkTopDown() to generate kotlin.io.FileTreeWalk on which we use iterator to traverse the directory and its contents. The functionality of the three functions is almost same except the order in which they iterate through contents.
| Kotlin function | Traversal order | When to use it |
|---|---|---|
walk() | Top-down by default | Use when you simply need to recursively visit a directory and its contents. |
walkTopDown() | Parent directory before child files and subdirectories | Use when the directory itself should be handled before its contents. |
walkBottomUp() | Child files and subdirectories before parent directory | Use when contents should be handled before the containing directory. |
All three functions include directories as well as files in the traversal result. If you want to print only files, add a condition such as if (it.isFile) or use filter { it.isFile }.
In the following examples, we will take a folder tree as shown below, to list out the files iteratively in a directory.

Sample Directory Structure Used in the Kotlin Examples
The examples below assume that the base directory contains a few text files and subdirectories. Replace the path in the sample programs with a path that exists on your computer.
/home/tutorialkart/tutorials
├── info.txt
├── list.txt
├── android
│ ├── textview.txt
│ └── button.txt
├── kotlin
│ ├── constructor.txt
│ └── expressions.txt
└── java
└── polymorphism.txt
Iterate through All Files using java.io.File.walk()
In this example, we will use File.walk() method to traverse the files in the directory and its sub-directories recursively.
example.kt
import java.io.File
/**
* Kotlin Example to traverse directory and its contents
*/
fun main(args: Array) {
// using extension function walk
File("/home/arjun/tutorials/").walk().forEach {
println(it)
}
}
Output
/home/tutorialkart/tutorials
/home/tutorialkart/tutorials/info.txt
/home/tutorialkart/tutorials/list.txt
/home/tutorialkart/tutorials/android
/home/tutorialkart/tutorials/android/textview.txt
/home/tutorialkart/tutorials/android/button.txt
/home/tutorialkart/tutorials/kotlin
/home/tutorialkart/tutorials/kotlin/constructor.txt
/home/tutorialkart/tutorials/kotlin/expressions.txt
/home/tutorialkart/tutorials/java
/home/tutorialkart/tutorials/java/polymorphism.txt
Iterate through All Files using java.io.File.walkBottomUp()
In this example, we will use File.walkBottomUp() method to list out the files in a given directory and its sub-directories.
example.kt
import java.io.File
/**
* Kotlin Example to traverse directory and its contents
*/
fun main(args: Array) {
// using extension function walkBottomUp
File("/home/arjun/tutorials/").walkBottomUp().forEach {
println(it)
}
}
Output
/home/tutorialkart/tutorials/info.txt
/home/tutorialkart/tutorials/list.txt
/home/tutorialkart/tutorials/android/textview.txt
/home/tutorialkart/tutorials/android/button.txt
/home/tutorialkart/tutorials/android
/home/tutorialkart/tutorials/kotlin/constructor.txt
/home/tutorialkart/tutorials/kotlin/expressions.txt
/home/tutorialkart/tutorials/kotlin
/home/tutorialkart/tutorials/java/polymorphism.txt
/home/tutorialkart/tutorials/java
/home/tutorialkart/tutorials
Iterate through All Files using java.io.File.walkTopDown()
In this example, we will use File.walkTopDown() method to list out the files in a given directory and its sub-directories.
example.kt
import java.io.File
/**
* Kotlin Example to traverse directory and its contents
*/
fun main(args: Array) {
// using extension function walkTopDown
File("/home/arjun/tutorials/").walkTopDown().forEach {
println(it)
}
}
Output
/home/tutorialkart/tutorials
/home/tutorialkart/tutorials/info.txt
/home/tutorialkart/tutorials/list.txt
/home/tutorialkart/tutorials/android
/home/tutorialkart/tutorials/android/textview.txt
/home/tutorialkart/tutorials/android/button.txt
/home/tutorialkart/tutorials/kotlin
/home/tutorialkart/tutorials/kotlin/constructor.txt
/home/tutorialkart/tutorials/kotlin/expressions.txt
/home/tutorialkart/tutorials/java
/home/tutorialkart/tutorials/java/polymorphism.txt
Kotlin Code to Print Only Files and Skip Directories
The earlier examples print both directories and files because FileTreeWalk visits every entry in the tree. In many programs, you may want only regular files. Use filter { it.isFile } before printing or processing the path.
Print only files recursively
import java.io.File
fun main() {
val rootDirectory = File("/home/tutorialkart/tutorials")
rootDirectory.walkTopDown()
.filter { it.isFile }
.forEach { file ->
println(file.absolutePath)
}
}
Output
/home/tutorialkart/tutorials/info.txt
/home/tutorialkart/tutorials/list.txt
/home/tutorialkart/tutorials/android/textview.txt
/home/tutorialkart/tutorials/android/button.txt
/home/tutorialkart/tutorials/kotlin/constructor.txt
/home/tutorialkart/tutorials/kotlin/expressions.txt
/home/tutorialkart/tutorials/java/polymorphism.txt
Kotlin Code to List Files Recursively by Extension
To list only files with a particular extension, combine recursive traversal with a file-name condition. The following Kotlin example prints only .txt files from the selected directory and all its subdirectories.
import java.io.File
fun main() {
val rootDirectory = File("/home/tutorialkart/tutorials")
rootDirectory.walk()
.filter { it.isFile && it.extension == "txt" }
.forEach { file ->
println(file.name)
}
}
Use it.extension.equals("txt", ignoreCase = true) if your file extensions may use mixed case, such as .TXT or .Txt.
Kotlin Code to Limit Recursive Directory Traversal Depth
When a directory has many nested levels, you may not want to traverse the whole tree. Use maxDepth() on the FileTreeWalk to limit how deep Kotlin should go from the starting directory.
import java.io.File
fun main() {
val rootDirectory = File("/home/tutorialkart/tutorials")
rootDirectory.walkTopDown()
.maxDepth(2)
.forEach { file ->
println(file.path)
}
}
A smaller depth is useful when you need only the files near the root directory. For a complete recursive listing, do not call maxDepth().
Kotlin File.walk() Safety Checks Before Listing a Directory
Before recursively listing files, check that the path exists and is a directory. This avoids confusing output when the path is wrong or when the path points to a single file instead of a folder.
import java.io.File
fun main() {
val rootDirectory = File("/home/tutorialkart/tutorials")
if (!rootDirectory.exists()) {
println("Directory does not exist: ${rootDirectory.absolutePath}")
return
}
if (!rootDirectory.isDirectory) {
println("Path is not a directory: ${rootDirectory.absolutePath}")
return
}
rootDirectory.walkTopDown()
.filter { it.isFile }
.forEach { println(it.absolutePath) }
}
When your program may encounter restricted folders, handle errors according to your application needs. File permissions, symbolic links, and platform-specific paths can affect the traversal result.
walk(), walkTopDown(), and walkBottomUp() Differences in Kotlin
Use walk() or walkTopDown() when you want a parent directory to appear before its children. Use walkBottomUp() when files and subdirectories should be processed before the parent directory. Bottom-up traversal is often useful for cleanup-style tasks because a directory can be handled after its contents.
For simple listing tasks, walk() is usually enough. For code readability, use walkTopDown() when you want to make the traversal order clear to another reader.
Common Mistakes While Iterating Files Recursively in Kotlin
- Printing directories when only files are needed: Add
filter { it.isFile }to skip directories. - Using a path that does not exist: Check
exists()andisDirectorybefore walking the tree. - Expecting the same path format on every operating system: Prefer
Fileand path APIs instead of manually joining path strings. - Processing very large directory trees without limits: Use filters and
maxDepth()when you do not need every nested file. - Confusing traversal order with sorting:
walkTopDown()andwalkBottomUp()define parent-child order, not alphabetical sorting.
Official Kotlin Reference for FileTreeWalk
For the standard library API details, refer to the Kotlin documentation for kotlin.io.FileTreeWalk. It documents the traversal type and related functions used by File.walk(), File.walkTopDown(), and File.walkBottomUp().
FAQs on Kotlin Recursive File Iteration
How do I iterate through all files in a directory recursively in Kotlin?
Use File("path").walk() or File("path").walkTopDown() and iterate with forEach. Add filter { it.isFile } if you want only files and not directories.
What is the difference between walk() and walkTopDown() in Kotlin?
walk() returns a FileTreeWalk that uses top-down traversal by default. walkTopDown() makes the top-down order explicit by visiting the parent directory before its child files and subdirectories.
How can I recursively list only .txt files in Kotlin?
Use walk() with a filter such as filter { it.isFile && it.extension == "txt" }. For case-insensitive matching, use it.extension.equals("txt", ignoreCase = true).
Does Kotlin File.walk() include directories in the result?
Yes. File.walk(), walkTopDown(), and walkBottomUp() include both files and directories. Filter with isFile when you need only files.
How do I limit recursive folder traversal in Kotlin?
Call maxDepth() on the FileTreeWalk. For example, File("path").walkTopDown().maxDepth(2) limits traversal to the specified depth from the starting directory.
Editorial QA Checklist for Kotlin Directory Walk Tutorial
- Confirm that the tutorial explains recursive file iteration with
walk(),walkTopDown(), andwalkBottomUp(). - Check that examples distinguish between printing all entries and printing only files with
isFile. - Verify that the directory image and existing code blocks remain unchanged.
- Ensure that new Kotlin examples use valid syntax and PrismJS
language-kotlin syntaxclasses. - Confirm that FAQs answer Kotlin-specific recursive directory traversal questions rather than generic file-loop questions from other languages.
Conclusion: Recursively Iterate Directory Files in Kotlin
In this Kotlin Tutorial, we have learnt to use java.io.File.walk(), java.io.File.walkTopDown() and java.io.File.walkBottomUp() functions to traverse or iterate through all files in a directory and its sub-directories recursively, with the help of Kotlin Examples.
TutorialKart.com