com.sta.mutils.FileUtils Maven / Gradle / Ivy
package com.sta.mutils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* Name: FileUtils
* Description: Hilfsklasse f?r Dateiverarbeitung.
*
* Urspr?nglicher Name: FileTools im Projekt Converter3.
* Verlagert nach MUtils und umbenannt in FileUtils am 07.02.2020.
*
* Folgendes Problem ist aufgetreten: Bei Verwendung mit Web-Seiten(-Inhalten) und Auslieferung von Daten mit der copy-Methode
* (z. B. Bilder, CSS-Dateien usw.), bricht zuweilen die Daten?bertragung ab (ggf. sogar gezielt durch den Client ausgel?st).
* In der Folge kommt es also zu Fehlern beim write-Aufruf, danach funktioniert das fluch/close jedoch auch nicht, was wiederum
* zu einem Fehler f?hrt, wodurch schlie?lich das close vom InputStream nicht mehr ausgef?hrt wurde.
*
* Korrektur: OutputStream und InputStream bei flush/close getrennt behandeln.
*
*
* Comment: ...
*
* Copyright: Copyright (c) 2014, 2016, 2017, 2019-2021
* Company: >StA-Soft<
* @author StA
* @version 1.0
*/
public final class FileUtils
{
/**
* Hilfsmethode: Kopiert die Daten aus is nach os und schlie?t is und os bei Bedarf.
* @param Typ des Ziel-Output-Streams
* @param os Ziel-Output-Stream
* @param is Quell-Input-Stream
* @param close true: is und os schlie?en, false: beide nicht schlie?en
* @return Ziel-Output-Stream (damit man z. B. bei einem ByteArrayOutputStream gleich toByteArray aufrufen kann)
* @throws IOException im Fehlerfall
*/
public static T copy(T os, InputStream is, boolean close) throws IOException
{
try
{
final int MAX = 4 * 1024;
byte[] b = new byte[MAX];
int len;
while ((len = is.read(b)) > 0)
{
os.write(b, 0, len);
}
}
finally
{
if (close)
{
try
{
os.flush();
os.close();
}
catch (Exception ex)
{
// ignore
}
try
{
is.close();
}
catch (Exception ex)
{
// ignore
}
}
}
return os;
}
/**
* Datei kopieren. Quell- und Zieldatei werden nach dem Kopieren geschlossen.
* @param dstfn Zieldateiname
* @param srcfn Quelldateiname
* @throws IOException im Fehlerfall
*/
public static void copy(String dstfn, String srcfn) throws IOException
{
copy(new FileOutputStream(dstfn), new FileInputStream(srcfn), true);
}
/**
* Datei kopieren. Quell- und Zieldatei werden nach dem Kopieren geschlossen.
* @param dst Zieldatei
* @param src Quelldatei
* @throws IOException im Fehlerfall
*/
public static void copyFile(File dst, File src) throws IOException
{
copy(new FileOutputStream(dst), new FileInputStream(src), true);
}
/**
* Datei kopieren, optional nur falls neuer, mit optionalem ?berschreiben.
* @param dst Zieldatei
* @param src Quelldatei
* @param onlyifnewer true: nur falls neuer, false: immer kopieren
* @throws IOException im Fehlerfall
*/
public static void copyFile(File dst, File src, boolean onlyifnewer) throws IOException
{
if (!dst.exists() || !onlyifnewer || (dst.lastModified() < src.lastModified()))
{
copyFile(dst, src);
}
}
/**
* Alle Dateien aus dem Quellverzeichnis ins Zielverzeichnis kopieren, ohne Rekursion, mit ?berschreiben.
* Der Name der Zieldatei bekommt ein Pr?fix (kann auch "" sein).
* @param dstdir Zielverzeichnis
* @param dstprefix Pr?fix f?r Zieldatei
* @param srcdir Quellverzeichnis
* @throws IOException im Fehlerfall
*/
public static void copyFiles(File dstdir, String dstprefix, File srcdir) throws IOException
{
String[] fns = srcdir.list();
if (fns != null)
{
for (String fn : fns)
{
File srcfile = new File(srcdir, fn);
if (srcfile.isFile())
{
copyFile(new File(dstdir, dstprefix + fn), srcfile);
}
}
}
}
/**
* Alle Dateien aus dem Quellverzeichnis ins Zielverzeichnis kopieren, ohne Rekursion, mit ?berschreiben.
* @param dstdir Zielverzeichnis
* @param srcdir Quellverzeichnis
* @throws IOException im Fehlerfall
*/
public static void copyFiles(File dstdir, File srcdir) throws IOException
{
copyFiles(dstdir, "", srcdir);
}
//---------------------------------------------------------------------------
/**
* Verzeichnis samt Inhalt l?schen, mit Rekursion.
* @param path Verzeichnis, was gel?scht werden soll
* @return true: erfolgreich, false: Fehler/Problem (z. B. Datei ge?ffnet/gesperrt)
* @throws FileNotFoundException im Fehlerfall
*/
public static boolean deleteDirectory(File path) throws FileNotFoundException
{
if (!path.exists())
{
throw new FileNotFoundException(path.getAbsolutePath());
}
boolean res = true;
if (path.isDirectory())
{
File[] files = path.listFiles();
if (files != null)
{
for (File f : files)
{
res = res && deleteDirectory(f);
}
}
}
res = res && path.delete();
return res;
}
//===========================================================================
/**
* Dummy-Constructor.
*/
private FileUtils()
{
}
}