Kotlin文件操作

发布于:2025-07-14 ⋅ 阅读:(13) ⋅ 点赞:(0)

文件操作

获取目录内容及获取文件/目录的父级路径

使用 File

val helloWorld = File("/Files/CompletedProjects/HelloWorld")
val helloWorldFilesNames = helloWorld.listFiles().map { it.name } // [Doc.pdf, Reviews.txt]

val reviews = File("/Files/CompletedProjects/HelloWorld/Reviews.txt")
val reviewsFiles = reviews.listFiles() // null

val soundtracks = File("/Files/Music/SoundTracks")
val soundtracksFiles = soundtracks.listFiles() // []

使用 Path

val helloWorld = Path("/Files/CompletedProjects/HelloWorld")
val helloWorldFilesNames = helloWorld.listDirectoryEntries().map { it.name } // [Doc.pdf, Reviews.txt]

val reviews = Path("/Files/CompletedProjects/HelloWorld/Reviews.txt")
val reviewsFiles = if (reviews.isDirectory()) reviews.listDirectoryEntries() else emptyList() // []

val soundtracks = Path("/Files/Music/SoundTracks")
val soundtracksFiles = if (soundtracks.isDirectory()) soundtracks.listDirectoryEntries() else emptyList() // []

解释:

  • reviewsFilesnull,因为 Reviews.txt 是一个普通文件,不是目录,因此不能包含子文件或子目录。

  • soundtracksFiles 是空数组([]),因为虽然它是目录,但里面没有文件或子目录。


获取父目录

  • File.parentPath.parent 返回父目录的路径字符串。

  • File.parentFilePath.parent.fileName 返回父目录的 FilePath 对象,方便进一步操作。

val files = File("/Files")
println(files.parent) // 输出: "/"
println(files.parentFile.name) // 输出: ""

val reviews = File("/Files/CompletedProjects/HelloWorld/Reviews.txt")
println(reviews.parent) // 输出: "/Files/CompletedProjects/HelloWorld"
println(reviews.parentFile.name) // 输出: "HelloWorld"

val root = File("/")
println(root.parent) // 输出: null
println(root.parentFile.name) // 抛出 java.lang.NullPointerException

双向遍历目录结构

使用 File.walk()Path.walk()

val files = File("/Files")

println("TOP_DOWN:")
files.walk(FileWalkDirection.TOP_DOWN).forEach { println(it) }

println("BOTTOM_UP:")
files.walk(FileWalkDirection.BOTTOM_UP).forEach { println(it) }

val dir = Path("/Files")

println("TOP_DOWN:")
dir.walk().forEach { println(it) }

println("BOTTOM_UP:")
dir.walk().asIterable().reversed().forEach { println(it) }

输出示例:

TOP_DOWN:
/Files
/Files/Music
/Files/Music/SoundTracks
/Files/CompletedProjects
/Files/CompletedProjects/HelloWorld
/Files/CompletedProjects/HelloWorld/Doc.pdf
/Files/CompletedProjects/HelloWorld/Reviews.txt
/Files/CompletedProjects/JCalculator
/Files/CompletedProjects/JCalculator/Doc.pdf

BOTTOM_UP:
/Files/Music/SoundTracks
/Files/Music
/Files/CompletedProjects/HelloWorld/Doc.pdf
/Files/CompletedProjects/HelloWorld/Reviews.txt
/Files/CompletedProjects/HelloWorld
/Files/CompletedProjects/JCalculator/Doc.pdf
/Files/CompletedProjects/JCalculator
/Files/CompletedProjects
/Files

等效方法还有:

  • File.walkBottomUp():自底向上遍历

  • File.walkTopDown():自顶向下遍历


操作目录结构

假设我们有如下目录结构,并要获取 CompletedProjects 下的项目:

val completedProjects = File("/Files/CompletedProjects")
val projects = completedProjects.walk()
projects.maxDepth(1) // 只遍历 HelloWorld 和 JCalculator

或者用 Path

val completedProjects = Path("/Files/CompletedProjects")
val projects = Files.walk(completedProjects, 1)

然后可以使用如下方式获取 HelloWorld 项目:

val helloWorldProject = projects.first { it.name == "HelloWorld" }

或者更简洁地:

val helloWorldProject = completedProjects.listFiles().first { it.name == "HelloWorld" }

从文件逐级向上寻找目录

Reviews.txt 开始,逐级寻找其祖先目录中名为 Files 的目录:

val reviews = File("/Files/CompletedProjects/HelloWorld/Reviews.txt")
var parent = reviews.parentFile
while (parent.name != "Files") {
    parent = parent.parentFile
}

val soundTracks = parent.walkTopDown().first { it.name == "SoundTracks" }

复制文件

复制单个文件

val fileIn = File("newFile.txt")
val fileOut = File("copyNewFile")
fileIn.copyTo(fileOut) // 不覆盖

// 若要覆盖:
fileIn.copyTo(fileOut, overwrite = true)
val fileIn = Path("newFile.txt")
val fileOut = Path("copyNewFile.txt")
fileIn.copyTo(fileOut)
fileIn.copyTo(fileOut, overwrite = true)

复制整个目录(递归)

使用 File.copyRecursively()

val fileIn = File("outDir")
val fileOut = File("newDir")
fileIn.copyRecursively(fileOut)
fileIn.copyRecursively(fileOut, overwrite = true)

使用 Path.copyToRecursively()

val pathIn = Path("outDir")
val pathOut = Path("newDir")
pathIn.copyToRecursively(pathOut)
pathIn.copyToRecursively(pathOut, overwrite = true, followLinks = true)

总结

  • Kotlin 提供了丰富的 API 来操作文件和目录,包括遍历、复制、获取父路径等。

  • 可以使用 FilePath 来创建、读取、遍历文件系统。

  • 遍历时注意根目录的处理,避免空指针异常。

  • 实际编程中应加上异常处理与空值检查。


网站公告

今日签到

点亮在社区的每一天
去签到