如何在SBT的build.sbt中创建文件夹并复制目录内容?
解决SBT中复制文件夹并创建目标目录结构的问题
嘿,刚接触SBT的时候我也碰到过这类文件操作的小麻烦,官方文档有时候对这种实操场景确实讲得不够直白。别担心,咱们可以通过自定义SBT任务来实现你要的需求,具体实现方法如下:
具体代码实现
直接在你的build.sbt文件里添加以下内容就行,不用额外引入依赖:
import java.nio.file.{Files, Paths, StandardCopyOption} // 定义一个自定义任务,命名为copyAToB val copyAToB = taskKey[Unit]("Copy folder a and its contents into folder b, creating b/a structure") copyAToB := { // 定义源目录和目标目录的路径 val sourceDir = Paths.get("a") val targetParentDir = Paths.get("b") val targetDir = targetParentDir.resolve("a") // 先创建目标父目录b(如果不存在的话) if (!Files.exists(targetParentDir)) { Files.createDirectories(targetParentDir) println(s"Created directory: ${targetParentDir.toAbsolutePath}") } // 递归复制源目录a到目标目录b/a的工具方法 def copyDirectory(source: java.nio.file.Path, target: java.nio.file.Path): Unit = { Files.walk(source).forEach { path => val targetPath = target.resolve(source.relativize(path)) if (Files.isDirectory(path)) { Files.createDirectories(targetPath) } else { Files.copy(path, targetPath, StandardCopyOption.REPLACE_EXISTING) } } } if (Files.exists(sourceDir)) { copyDirectory(sourceDir, targetDir) println(s"Successfully copied ${sourceDir.toAbsolutePath} to ${targetDir.toAbsolutePath}") } else { println(s"Error: Source directory ${sourceDir.toAbsolutePath} does not exist!") } }
怎么使用这个任务
在终端里执行下面的命令,就能触发文件夹复制操作了:
sbt copyAToB
代码简单说明
- 用Java NIO的文件API来做操作,这是JDK自带的功能,不用额外加依赖包。
taskKey[Unit]用来定义一个没有返回值的SBT任务,起个好记的名字copyAToB方便调用。- 先检查并创建目标文件夹
b,再通过递归方法把a文件夹里的所有内容完整复制到b/a路径下。 - 还加了源目录不存在的判断,避免任务直接崩溃,会打印明确的错误提示。
亲测这个方法能完美实现你要的b/a目录结构,试试就知道啦!
内容的提问来源于stack exchange,提问作者user4380125
相关产品推荐
相关产品推荐

