/* 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.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; /** * Entpacken von Dateien * * @author Ulrich Hilger, 15. Januar 2024 */ public class Inflator { /** * Eine Zip-Datei entpacken * * @param fName Name der Zip-Datei * @param base absoluter Pfad des Ablageortes der Zip-Datei * @return 'ok', wenn erfolgreich oder Fehlermeldung, wenn nicht */ public String extractZipfile(String fName, /*String relPath, */String base) { //logger.fine("fName: " + fName + ", relPath: " + relPath); String result = null; // if (!relPath.startsWith(".")) { try { //File targetDir = new File(fileBase, relPath); //File targetDir = getTargetDir(relPath); File archive = new File(base, fName); if (extract(archive)) { result = "ok"; } else { result = "error while extracting"; } } catch (Exception ex) { result = ex.getLocalizedMessage(); //logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); } // } else { // result = "Falsche relative Pfadangabe."; // } return result; } /** * Eine Datei in den Ordner entpacken, in dem sie liegt * * @param archive die zu entpackende Zip-Datei * @throws Exception wenn etwas schief geht */ private boolean extract(File archive) throws Exception { ZipFile zipfile = new ZipFile(archive); Enumeration en = zipfile.entries(); while (en.hasMoreElements()) { ZipEntry zipentry = (ZipEntry) en.nextElement(); unzip(zipfile, zipentry, archive.getParent()); } zipfile.close(); return true; } /** * unzip a given entry of a given zip file to a given location * Einen Eintrag in einer ZIP-Datei an einen gegebenen Ausgabeort extrahieren * * @param zipfile die Zip-Datei, aus der ein zu entpackender Eintrag gelesen werden soll * @param zipentry der Eintrag, der entpackt werden soll * @param destPath der Pfad zum Ausgabeort * @throws IOException wenn etwas schief geht */ private void unzip(ZipFile zipfile, ZipEntry zipentry, String destPath) throws IOException { byte buf[] = new byte[1024]; InputStream is = zipfile.getInputStream(zipentry); String outFileName = destPath + File.separator + zipentry.getName(); File file = new File(outFileName); if (!zipentry.isDirectory()) { file.getParentFile().mkdirs(); if (!file.exists()) { file.createNewFile(); } FileOutputStream fos = new FileOutputStream(file); int i = is.read(buf, 0, 1024); while (i > -1) { fos.write(buf, 0, i); i = is.read(buf, 0, 1024); } fos.close(); is.close(); } else { file.mkdirs(); } } }