/* 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 . */ package de.uhilger.fm; import java.io.File; import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; /** * Loeschen von Dateien und Ordnern * * @author Ulrich Hilger, 15. Januar 2024 */ public class Eraser { public static final int OP_DELETE = 3; private final String STR_DOT = "."; /** * Dateien und Ordner loeschen * * @param relPath der relative Pfad, der gemeinsam mit 'base' den absoluten * Pfad zum Ordner ergibt, der die zu loeschenden Dateien enthaelt * @param fileNames Liste mit Namen von Dateien und Ordnern, die geloescht werden sollen * @param base absoluter Basispfad * @return "deleted" oder null, wenn ein Fehler auftrat */ public String deleteFiles(String relPath, List fileNames, String base) { String result = null; try { //logger.fine(fileNames.toString()); if (!relPath.startsWith(STR_DOT)) { File targetDir = new File(base, relPath); // getTargetDir(relPath); //logger.fine("targetDir: " + targetDir); for (String fileName : fileNames) { File targetFile = new File(targetDir, fileName); //logger.fine(targetFile.getAbsolutePath()); if (targetFile.isDirectory()) { FileOpsVisitor bearbeiter = new FileOpsVisitor(); bearbeiter.setOperation(OP_DELETE); Files.walkFileTree(targetFile.toPath(), bearbeiter); } else { /* Wenn targetFile mit jpg, jpeg oder png endet, muss eine Unterfunktion eine Liste aller Dateien bilden, die so heissen, also z.B. alle [Dateiname]*.jpg */ String fname = targetFile.getName().toLowerCase(); if (fname.endsWith(ImageFileFilter.JPEG) || fname.endsWith(ImageFileFilter.JPG) || fname.endsWith(ImageFileFilter.PNG)) { deleteImgFiles(targetDir, targetFile); } else { targetFile.delete(); } } } result = "deleted"; } } catch (IOException ex) { Logger.getLogger(Eraser.class.getName()).log(Level.SEVERE, ex.getMessage(), ex); } return result; } /** * Alle Varianten einer Bilddatei loeschen * * @param targetDir der Ordner, aus dem geloescht werden soll * @param targetFile Bilddatei, deren Varianten geloescht werden sollen * @throws IOException wenn etwas schief geht */ private void deleteImgFiles(File targetDir, File targetFile) throws IOException { String fnameext = targetFile.getName(); int dotpos = fnameext.lastIndexOf(STR_DOT); String fname = fnameext.substring(0, dotpos); String ext = fnameext.substring(dotpos); //logger.fine("fname: " + fname + ", ext: " + ext); DirectoryStream stream = Files.newDirectoryStream(targetDir.toPath(), fname + "*" + ext); //"*.{txt,doc,pdf,ppt}" for (Path path : stream) { //logger.fine(path.getFileName().toString()); Files.delete(path); } stream.close(); } }