Функция walk

Функция walk выполняет рекурсивный обход файлового дерева, начиная с указанной директории. Возвращает последовательность File объектов, представляющих файлы и директории в порядке обхода в глубину. Функция позволяет указать направление обхода: сверху вниз или снизу вверх.

Импорт

kotlinimport java.io.File

Синтаксис

kotlinfun File.walk(direction: FileWalkDirection = FileWalkDirection.TOP_DOWN): FileTreeWalk
kotlinfun File.walkBottomUp(): FileTreeWalk
kotlinfun File.walkTopDown(): FileTreeWalk

Пример

Обойдем все файлы и директории в "/home/user/docs" с направлением обхода сверху вниз:

kotlinval directory = File("/home/user/docs")
val files: Sequence<File> = directory.walk()

files.forEach { file ->
  println(file.absolutePath)
}

Результат выполнения кода:

kotlin"/home/user/docs"
"/home/user/docs/file1.txt"
"/home/user/docs/subdir"
"/home/user/docs/subdir/file2.txt"

Пример

Обойдем все файлы и директории в "/home/user/docs" с направлением обхода снизу вверх:

kotlinval directory = File("/home/user/docs")
val files: Sequence<File> = directory.walkBottomUp()

files.forEach { file ->
  println(file.absolutePath)
}

Результат выполнения кода:

kotlin"/home/user/docs/file1.txt"
"/home/user/docs/subdir/file2.txt"
"/home/user/docs/subdir"
"/home/user/docs"

Пример

Отфильтруем только файлы с расширением ".txt" в директории "/home/user/docs":

kotlinval directory = File("/home/user/docs")
val txtFiles = directory.walk()
  .filter { it.isFile && it.extension == "txt" }

txtFiles.forEach { file ->
  println(file.absolutePath)
}

Результат выполнения кода:

kotlin"/home/user/docs/file1.txt"
"/home/user/docs/subdir/file2.txt"

Пример

Подсчитаем общий размер всех файлов в директории "/home/user/docs":

kotlinval directory = File("/home/user/docs")
val totalSize = directory.walk()
  .filter { it.isFile }
  .sumOf { it.length() }

println("Total size: $totalSize bytes")

Результат выполнения кода:

kotlinTotal size: 2048 bytes

Пример

Найдем все пустые директории в "/home/user/docs":

kotlinval directory = File("/home/user/docs")
val emptyDirs = directory.walk()
  .filter { it.isDirectory && it.list()?.isEmpty() ?: false }

emptyDirs.forEach { dir ->
  println("Empty directory: ${dir.absolutePath}")
}

Результат выполнения кода:

kotlinEmpty directory: "/home/user/docs/empty_dir"

Смотрите также

  • класс File,
    который представляет файл или директорию
  • функцию listFiles,
    которая возвращает содержимое директории без рекурсивного обхода
  • функцию copyRecursively,
    которая рекурсивно копирует файлы и директории
  • функцию deleteRecursively,
    которая рекурсивно удаляет файлы и директории