FileVisitor
これは、 がどのように機能し、ディレクトリを解析するかについての私の知識が限られていることに関係していると思います。私がやろうとしているのは、ディレクトリの内容を別のディレクトリに移動することです。私はこのFileVisitor<Path>
ように実装することでこれを行っています:
public class Mover implements FileVisitor<Path> {
private Path target;
private Path source;
public Mover(Path source, Path target) {
this.target = target;
this.source = source;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Path targetDir = target.resolve(source.relativize(dir));
try {
Files.move(dir, targetDir);
} catch (FileAlreadyExistsException e) {
if(!Files.isDirectory(targetDir)) {
System.out.println("Throwing e!");
throw e;
}
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
try {
Files.move(file, target.resolve(source.relativize(file)));
} catch (NoSuchFileException e) {
//TODO: Figure out why this exception is raised!
System.out.println("NoSuchFileException");
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
}
次に、クラスMover
を次のように使用します。
Files.walkFileTree(from, new Mover(from, to));
from
を呼び出すときに2回追加するのは好きではありませんwalkFileTree
が、現在、私の問題は主にTODO
コード内の の下の行にあります(ただし、それを解決する方法についてのコメントをいただければ幸いです)。その例外が発生する理由がわかりません。ファイルが既に移動されているためだと思います。その場合、コードが再び移動しようとするのを止めるにはどうすればよいですか?現在行っている方法は多かれ少なかれ正しいですか?