From e1fae256e29eb7a317d5a810d7e24751eb6032eb Mon Sep 17 00:00:00 2001 From: ulrich Date: Wed, 13 Nov 2024 22:45:34 +0000 Subject: [PATCH] Dokumentation in Arbeit --- src/de/uhilger/fm/FileOpsVisitor.java | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 176 insertions(+), 0 deletions(-) diff --git a/src/de/uhilger/fm/FileOpsVisitor.java b/src/de/uhilger/fm/FileOpsVisitor.java new file mode 100644 index 0000000..d6dfcb9 --- /dev/null +++ b/src/de/uhilger/fm/FileOpsVisitor.java @@ -0,0 +1,176 @@ +/* + fm - File management class library + Copyright (C) 2024 Ulrich Hilger + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +package de.uhilger.fm; + +import java.io.File; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.BasicFileAttributes; + +/** + * Ein FileVisitor zum Verschieben, Kopieren oder Loeschen ganzer Ordnerstrukturen mit + * Hilfe der Methode Files.walkFileTree von java.nio. + * + * @author Ulrich Hilger + * @version 1, 14. Mai 2021 + */ +public class FileOpsVisitor extends FileHelper implements FileVisitor { + + private Path targetDir; + private int operation; + + /** + * Den Zielordner fuer Kopier- oder Verschiebeoperationen angeben + * + * @param targetDir der Zielordner + */ + public void setTargetDir(Path targetDir) { + this.targetDir = targetDir; + } + + /** + * Die gewuenschte Dateioperation angeben, + * OP_COPY, OP_MOVE oder OP_DELETE + * + * @param op die Dateioperation + */ + public void setOperation(int op) { + this.operation = op; + } + + /** + * Dafuer sorgen, dass beim Kopieren oder Verschieben kein am Ziel bereits existierender + * Ordner ueberschrieben wird, indem am Ziel fuer einen bereits existierenden Ordner ein + * anderer Name mit laufender Nummer erzeugt wird. + * + * Invoked for a directory before entries in the directory are visited. If this method + * returns CONTINUE, then entries in the directory are visited. If this method returns + * SKIP_SUBTREE or SKIP_SIBLINGS then entries in the directory (and any descendants) + * will not be visited. + * + * @param dir Zielordner + * @param attrs die gewuenschten Attribute + * @return gibt stets FileVisitResult.CONTINUE zurueck + * @throws IOException wenn etwas schief geht + */ + @Override + public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) + throws IOException { + if (operation != Eraser.OP_DELETE) { + if (dir instanceof Path) { + Path sourceDir = (Path) dir; + File destFile = targetDir.resolve(sourceDir.getFileName()).toFile(); + //logger.fine("sourceDir: " + sourceDir + ", destFile: " + destFile); + if (destFile.exists()) { + File newDir = getNewFileName(destFile); + destFile.renameTo(newDir); + } + destFile.mkdir(); + this.targetDir = destFile.toPath(); + //logger.fine("targetDir now: " + targetDir.toString()); + } + } + return FileVisitResult.CONTINUE; + } + + /** + * Fuer jede Datei die gewuenschte Dateioperation ausführen + * + * Invoked for a file in a directory. + * + * @param file die zu bearbeitende Datei a reference to the file + * @param attrs the directory's basic attributes + * @return stets FileVisitResult.CONTINUE + * @throws IOException wenn etwas schief geht + */ + @Override + public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException { + if(operation != Eraser.OP_DELETE) { + if (file instanceof Path) { + Path source = (Path) file; + File destFile = targetDir.resolve(source.getFileName()).toFile(); + if (destFile.exists()) { + destFile = getNewFileName(destFile); + } + if (operation == Mover.OP_MOVE) { + Files.move(source, destFile.toPath()); + } else if (operation == Mover.OP_COPY) { + Files.copy(source, destFile.toPath()); + } + } + } else { + Files.delete((Path) file); + } + return FileVisitResult.CONTINUE; + } + + /** + * Bei diesem Visitor bleibt diese Methode ungenutzt, hier muessten noch Faelle + * behandelt werden, die zu einem Abbruch fuehren und ggf. ein Rollback realisiert werden. + * + * Invoked for a file that could not be visited. This method is invoked if the file's attributes + * could not be read, the file is a directory that could not be opened, and other reasons. + * + * @param file die Datei, bei der es zum Abbruch kam + * @param exc the I/O exception that prevented the file from being visited + * @return stets FileVisitResult.CONTINUE + * @throws IOException wenn etwas schief laeuft + */ + @Override + public FileVisitResult visitFileFailed(Object file, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + + /** + * Fuer jede Datei Schritte ausfuehren, wie sie sich nach einer Dateioperation ergeben. + * Hier wird beim Verschieben von Dateien das Quellverzeichnis geloescht, nachdem es zum + * Ziel uebertragen wurde. + * + * Invoked for a directory after entries in the directory, and all of their descendants, + * have been visited. This method is also invoked when iteration of the directory completes + * prematurely (by a visitFile method returning SKIP_SIBLINGS, or an I/O error when + * iterating over the directory). + * + * @param dir der fertig durchlaufene Quellordner + * @param exc null if the iteration of the directory completes without an error; otherwise + * the I/O exception that caused the iteration of the directory to complete prematurely + * @return + * @throws IOException + */ + @Override + public FileVisitResult postVisitDirectory(Object dir, IOException exc) throws IOException { + if (operation != Eraser.OP_DELETE) { + if (dir instanceof Path) { + Path finishedDir = (Path) dir; + targetDir = targetDir.getParent(); + if(operation == Mover.OP_MOVE) { + //logger.fine("delete " + finishedDir.toString()); + Files.delete(finishedDir); + } + } + //logger.fine("targetDir now: " + targetDir.toString()); + } else { + Files.delete((Path) dir); + } + return FileVisitResult.CONTINUE; + } + +} -- Gitblit v1.9.3