forked from scalacenter/scastie
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCopyRecursively.scala
46 lines (37 loc) · 1.22 KB
/
CopyRecursively.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.nio.file.{Path, Files, SimpleFileVisitor, FileVisitResult}
import java.nio.file.attribute.BasicFileAttributes
object CopyRecursively {
def apply(source: Path, destination: Path, directoryFilter: (Path, Int) => Boolean): Unit = {
Files.walkFileTree(
source,
new CopyVisitor(source, destination, directoryFilter)
)
}
}
class CopyVisitor(source: Path, destination: Path, directoryFilter: (Path, Int) => Boolean) extends SimpleFileVisitor[Path] {
private def relative(subPath: Path): Path =
destination.resolve(source.relativize(subPath))
private def pathDepth(dir: Path): Int = {
dir.getNameCount - source.getNameCount - 1
}
override def preVisitDirectory(
dir: Path,
attrs: BasicFileAttributes
): FileVisitResult = {
def copy(): FileVisitResult = {
Files.createDirectories(relative(dir))
FileVisitResult.CONTINUE
}
if (dir == source) {
copy()
} else if (directoryFilter(source.relativize(dir), pathDepth(dir))) {
copy()
} else {
FileVisitResult.SKIP_SUBTREE
}
}
override def visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult = {
Files.copy(file, relative(file))
FileVisitResult.CONTINUE
}
}