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 functionTraversal orderWhen to use it
walk()Top-down by defaultUse when you simply need to recursively visit a directory and its contents.
walkTopDown()Parent directory before child files and subdirectoriesUse when the directory itself should be handled before its contents.
walkBottomUp()Child files and subdirectories before parent directoryUse 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.

Traverse or iterate through all files in a directory using Kotlin - Kotlin Example - Kotlin Tutorial - www.tutorialkart.com

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

</>
Copy
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

</>
Copy
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

</>
Copy
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

</>
Copy
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.

</>
Copy
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.

</>
Copy
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.

</>
Copy
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() and isDirectory before walking the tree.
  • Expecting the same path format on every operating system: Prefer File and 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() and walkBottomUp() 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(), and walkBottomUp().
  • 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 syntax classes.
  • 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.