Kotlin文件操作
文件操作
获取目录内容及获取文件/目录的父级路径
使用 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() // nullval 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() // []
解释:
-
reviewsFiles
是null
,因为Reviews.txt
是一个普通文件,不是目录,因此不能包含子文件或子目录。 -
soundtracksFiles
是空数组([]
),因为虽然它是目录,但里面没有文件或子目录。
获取父目录
-
File.parent
或Path.parent
返回父目录的路径字符串。 -
File.parentFile
或Path.parent.fileName
返回父目录的File
或Path
对象,方便进一步操作。
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.pdfBOTTOM_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 来操作文件和目录,包括遍历、复制、获取父路径等。
-
可以使用
File
和Path
来创建、读取、遍历文件系统。 -
遍历时注意根目录的处理,避免空指针异常。
-
实际编程中应加上异常处理与空值检查。