package javacodebook.io.copydir; import java.io.*; import javacodebook.io.copyfile.CopyFile; /** * Eine Implementierung von FileVisitor, mit der ganze Verzeichnisse * mitsamt Inhalt kopiert werden können. Es wird jeweils der * relative Pfad einer Datei oder eines Verzeichnisses zum * Quellverzeichnis ermittelt und im Zielverzeichnis entsprechend * verwendet, um dort die Datei oder das Verzeichnis anzulegen. * * @author Dirk Brodersen */ public class CopyDirVisitor implements javacodebook.io.dirtree.FileVisitor { //Das Quellverzeichnis private File sourceDir; //Das Zielverzeichnis, in das kopiert werden soll private File targetDir; /** Erzeugt einen neuen CopyDirVisitor, mit dem Dateien aus * einem Quellverzeichnis an die entsprechenden Stellen im * Zielverzeichnis kopiert werden. */ public CopyDirVisitor(File sourceDir, File targetDir) { if(!sourceDir.exists() || !sourceDir.isDirectory()) throw new RuntimeException("Quellverzeichnis nicht gültig"); if(targetDir.exists() && ! targetDir.isDirectory()) throw new RuntimeException("Ziel ist kein Verzeichnis"); else if(!targetDir.exists()) targetDir.mkdirs(); this.targetDir = targetDir; this.sourceDir = sourceDir; } /** Verarbeitet ein Verzeichnis */ public void visitDirectory(File f) throws IOException { if(!f.isDirectory()) throw new RuntimeException("Kein Verzeichnis: " + f.getAbsolutePath()); String relativePath = f.getAbsolutePath().substring( sourceDir.getAbsolutePath().length(), f.getAbsolutePath().length()); System.out.println(relativePath); File createDir = new File(targetDir, relativePath); createDir.mkdirs(); } /** Verarbeitet eine Datei */ public void visitFile(File f) throws IOException { String relativePath = f.getAbsolutePath().substring( sourceDir.getAbsolutePath().length(), f.getAbsolutePath().length()); File targetFile = new File(targetDir, relativePath); copyFile(f, targetFile); } /** Kopiert eine Datei von source nach target */ private void copyFile(File source, File target) throws IOException { //Zum Kopieren wird die copyFile-Methode aus dem //entsprechenden Rezept verwendet CopyFile.copyFile(source, target); } /** Verarbeitet ein Verzeichnis, wird hier nicht verwendet */ public void visitDirectory(File f, int mode) throws IOException { } } --- Neue Klasse --- package javacodebook.io.copydir; import java.io.*; import javacodebook.io.dirtree.FileVisitor; import javacodebook.io.dirtree.FileTreeWalker; /** * Eine Klasse, die ähnlich wie CopyFile aus dem Rezept * "Eine Datei kopieren" arbeitet, aber ganze Verzeichnisbäume * kopiert. */ public class CopyDir { public static void main(String[] args) throws Exception { if(args.length != 2) usage(); String source = args[0]; String target = args[1]; copyDir(source, target); } public static void copyDir(String source, String target) throws IOException { File sourceDir = new File(source); CopyDirVisitor visitor = new CopyDirVisitor(sourceDir, new File(target)); FileTreeWalker walker = new FileTreeWalker(sourceDir, visitor, null); walker.start(); } public static void usage() { System.out.println("Benutzung: java javacodebook.io.copydir.CopyDir Quellverzeichnis Zielverzeichnis"); System.exit(0); } }