/*
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();
}
}