Java 學習記錄97 — Copy Entire Tree

張小雄
2 min readDec 18, 2021

--

今天學的是如何複製資料夾含裡面的檔案

CopyFiles.java

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class CopyFiles extends SimpleFileVisitor<Path> { private Path sourceRoot;
private Path targetRoot;
public CopyFiles(Path sourceRoot, Path targetRoot) {
this.sourceRoot = sourceRoot;
this.targetRoot = targetRoot;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
System.out.println("Error accessing file: " + file.toAbsolutePath() + " " + exc.getMessage());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Path relativizePath = sourceRoot.relativize(dir);
System.out.println("RelativizePath = " + relativizePath);
Path copyDir = targetRoot.resolve(relativizePath);
System.out.println("Resolved path for copy = " + copyDir);
try {
Files.copy(dir, copyDir);
} catch (IOException e) {
System.out.println(e.getMessage());
return FileVisitResult.SKIP_SUBTREE;
}
return FileVisitResult.CONTINUE; } @Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Path relativizePath = sourceRoot.relativize(file);
System.out.println("RelativizePath = " + relativizePath);
Path copyDir = targetRoot.resolve(relativizePath);
System.out.println("Resolved path for copy = " + copyDir);
try {
Files.copy(file, copyDir);
} catch (IOException e) {
System.out.println(e.getMessage());
}
return FileVisitResult.CONTINUE;
}
}
System.out.println("--- Copy Dir2 to Dir4 / Dir2Copy ---");
Path copyPath = FileSystems.getDefault().getPath(String.join(File.separator, "src", "nonBlockingIO", "path", "copyExamples", "Dir4","Dir2Copy"));
// FileTree/Dir4/Dir2Copy
Path dir2Path = FileSystems.getDefault().getPath(String.join(File.separator, "src", "nonBlockingIO", "path", "copyExamples", "Dir2"));
try{
Files.walkFileTree(dir2Path,new CopyFiles(dir2Path,copyPath) );
}catch (IOException e){
System.out.println(e.getMessage());
}

輸出結果:

— — Copy Dir2 to Dir4 / Dir2Copy — -

RelativizePath =

Resolved path for copy = src\nonBlockingIO\path\copyExamples\Dir4\Dir2Copy

RelativizePath = Dir3

Resolved path for copy = src\nonBlockingIO\path\copyExamples\Dir4\Dir2Copy\Dir3

RelativizePath = Dir3\Dir4

Resolved path for copy = src\nonBlockingIO\path\copyExamples\Dir4\Dir2Copy\Dir3\Dir4

RelativizePath = Dir3\Dir4\Dir5

Resolved path for copy = src\nonBlockingIO\path\copyExamples\Dir4\Dir2Copy\Dir3\Dir4\Dir5

RelativizePath = Dir3\Dir4\Dir5\Dir6

Resolved path for copy = src\nonBlockingIO\path\copyExamples\Dir4\Dir2Copy\Dir3\Dir4\Dir5\Dir6

RelativizePath = Dir3\Dir4\Dir5\Dir6\Dir7

Resolved path for copy = src\nonBlockingIO\path\copyExamples\Dir4\Dir2Copy\Dir3\Dir4\Dir5\Dir6\Dir7

RelativizePath = Dir3\file1.txt

Resolved path for copy = src\nonBlockingIO\path\copyExamples\Dir4\Dir2Copy\Dir3\file1.txt

RelativizePath = Dir3\file2.txt

Resolved path for copy = src\nonBlockingIO\path\copyExamples\Dir4\Dir2Copy\Dir3\file2.txt

RelativizePath = file1.txt

Resolved path for copy = src\nonBlockingIO\path\copyExamples\Dir4\Dir2Copy\file1.txt

RelativizePath = file2.txt

Resolved path for copy = src\nonBlockingIO\path\copyExamples\Dir4\Dir2Copy\file2.txt

RelativizePath = file3.dat

Resolved path for copy = src\nonBlockingIO\path\copyExamples\Dir4\Dir2Copy\file3.dat

上面代碼全都紀錄在我的 Github

--

--

張小雄
張小雄

Written by 張小雄

記錄成為軟體工程師的過程

No responses yet