package ch.medshare.util; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.nio.charset.Charset; import java.text.MessageFormat; import java.util.zip.GZIPInputStream; public class UtilFile { public static String DIRECTORY_SEPARATOR = File.separator; public static final String ZIP_EXTENSION = ".gz"; //$NON-NLS-1$ private static String getCorrectSeparators(final String pathOrFilename){ return pathOrFilename.replace("\\", DIRECTORY_SEPARATOR).replace("//", //$NON-NLS-1$ //$NON-NLS-2$ DIRECTORY_SEPARATOR).replace("/", DIRECTORY_SEPARATOR); //$NON-NLS-1$ } private static String removeMultipleSeparators(String pathOrFilename){ String doubleSeparator = DIRECTORY_SEPARATOR + DIRECTORY_SEPARATOR; if (pathOrFilename.indexOf(doubleSeparator) >= 0) { pathOrFilename = pathOrFilename.replace(doubleSeparator, DIRECTORY_SEPARATOR); } return pathOrFilename; } /** * Überprüft ob Verzeichnis korrekt ist. Falls nicht, wird das Verzeichnis korrigiert. * * @param path * oder null */ public static String getCorrectPath(String path) throws IllegalArgumentException{ if (path == null) { return ""; //$NON-NLS-1$ } path = getCorrectSeparators(path); path = removeMultipleSeparators(path); if (!path.endsWith(DIRECTORY_SEPARATOR)) { path += DIRECTORY_SEPARATOR; } return path; } /** * Überprüft, ob eine Datei existiert */ public static boolean doesFileExist(final String filePathName){ File file = new File(filePathName); return file.isFile() && file.exists(); } /** * Überprüft, ob es sich um ein absolutes Verzeichnis handelt */ public static boolean isRootDir(String dir){ return (dir.startsWith(DIRECTORY_SEPARATOR) || dir.indexOf(":") > 0);// Linux & Windows Root //$NON-NLS-1$ } /** * Löscht Datei * * @param filePathName * Filename with path information * @return true if successful deleted, otherwise false */ public static boolean deleteFile(final String filePathName) throws IllegalArgumentException{ if (doesFileExist(filePathName)) { File file = new File(filePathName); return file.delete(); } return true; } /** * Liest serialisiertes Java Objekt */ public static Object readObject(final String fileNamePath) throws IOException, ClassNotFoundException{ FileInputStream fis = null; ObjectInputStream in = null; try { fis = new FileInputStream(fileNamePath); in = new ObjectInputStream(fis); return in.readObject(); } finally { if (in != null) { in.close(); } } } /** * Liest binäre gezippte Datei */ public static byte[] readZippedFile(final String filenamePath) throws IOException{ byte[] daten = new byte[1024]; try (ByteArrayOutputStream out = new ByteArrayOutputStream(); GZIPInputStream in = new GZIPInputStream(new FileInputStream(filenamePath))) { int read = 0; while ((read = in.read(daten, 0, 1024)) != -1) out.write(daten, 0, read); return out.toByteArray(); } } /** * Liest binäre Datei. Vorsicht bei grossen Dateien. Diese können zu einem OutOfMemory Error * führen. Grosse Dateien sollten wenn möglich in einzelnen Blöcken (InputStream) gelesen * werden. */ public static byte[] readFile(final String fileNamePath) throws IOException{ FileInputStream input = null; byte[] daten = null; try { input = new FileInputStream(fileNamePath); daten = new byte[input.available()]; input.read(daten); } finally { if (input != null) { input.close(); } } return daten; } /** * Liest Text Datei */ public static String readTextFile(final String fileNamePath) throws IOException{ return readTextFile(fileNamePath, Charset.defaultCharset().name()); } /** * Liest Text Datei */ public static String readTextFile(final String fileNamePath, final String charsetName) throws IOException{ byte[] text = readFile(fileNamePath); return new String(text, charsetName); } /** * Schreibt (serialisiert) Java Objekt */ public static void writeObject(final String fileNamePath, Object obj) throws IOException{ FileOutputStream fos = null; ObjectOutputStream out = null; try { fos = new FileOutputStream(fileNamePath); out = new ObjectOutputStream(fos); out.writeObject(obj); } finally { if (out != null) { out.close(); } } } /** * Schreibt binäre Datei */ public static void writeFile(final String fileNamePath, final byte[] daten) throws IOException{ FileOutputStream output = null; try { output = new FileOutputStream(fileNamePath); output.write(daten); } finally { if (output != null) { output.close(); } } } /** * Schreibt Text Datei */ public static void writeTextFile(final String fileNamePath, final String text) throws IOException{ if (text != null) { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(fileNamePath)); bw.write(text); } finally { if (bw != null) { bw.close(); } } } } /** * Copy file 'from' to file 'to' If not successful, exception is thrown */ public static void copyFile(final String from, final String to) throws IOException{ byte[] daten = readFile(from); writeFile(to, daten); } /** * Move file 'from' to file 'to' * * @return true if successful deleted, otherwise false or exception */ public static boolean moveFile(final String from, final String to) throws IOException{ byte[] daten = readFile(from); writeFile(to, daten); // Write was ok. Now delete the file return deleteFile(from); } /** * Retourniert Pfad ohne Dateinamen als String */ public static String getFilepath(final String filenamePath){ String correctFilenamePath = getCorrectSeparators(filenamePath); if (correctFilenamePath.indexOf(DIRECTORY_SEPARATOR) < 0) { return ""; //$NON-NLS-1$ } return correctFilenamePath.substring(0, correctFilenamePath .lastIndexOf(DIRECTORY_SEPARATOR)); } /** * Retourniert Dateinamen ohne Pfad als String */ public static String getFilename(final String filenamePath){ String correctFilenamePath = getCorrectSeparators(filenamePath); if (correctFilenamePath.indexOf(DIRECTORY_SEPARATOR) < 0) { return filenamePath; } return correctFilenamePath.substring( correctFilenamePath.lastIndexOf(DIRECTORY_SEPARATOR) + 1, correctFilenamePath.length()); } /** * Retourniert Dateinamen ohne Pfad und Endung. Falls keine Endung vorhanden ist, wird der * Dateinamen retourniert. */ public static String getNakedFilename(final String filenamePath){ String filename = getFilename(filenamePath); if (filename.lastIndexOf(".") > 0) { //$NON-NLS-1$ return filename.substring(0, filename.lastIndexOf(".")); //$NON-NLS-1$ } return filename; } /** * Retourniert Dateiendung (mit Punkt). Falls keine Endung gefunden wird, wird ein leerer String * retourniert. */ public static String getFileExtension(final String filenamePath){ String filename = getFilename(filenamePath); if (filename.lastIndexOf(".") > 0) { //$NON-NLS-1$ return filename.substring(filename.lastIndexOf("."), filename.length()); //$NON-NLS-1$ } return ""; //$NON-NLS-1$ } /** * Fügt die beiden Pfade zusammen. Fügt Separator ein, achtet darauf dass nicht doppelter * Separator * * @param sPart1 * @param sPart2 * @return */ public static String concatenatePath(String sPart1, String sPart2){ if (sPart1 == null || sPart2 == null) { System.err.println("cannot concatenate nulls, part1: " + sPart1 //$NON-NLS-1$ + " part2: " + sPart2); //$NON-NLS-1$ return null; } if (!sPart1.endsWith(DIRECTORY_SEPARATOR)) { sPart1 += DIRECTORY_SEPARATOR; } if (sPart2.startsWith(DIRECTORY_SEPARATOR)) { sPart2 = sPart2.substring(1); } return sPart1 + sPart2; } /** * Fügt die drei Pfade zusammen. Fügt Separator ein, achtet darauf dass nicht doppelter * Separator * * @param parts * Die einzelnen Pfadteile als String * @param sPart2 * @param sPart3 * @return */ public static String concatenatePaths(String[] parts){ StringBuilder sb = new StringBuilder(); if (parts != null) { for (int i = 0; i < parts.length; i++) { String sPart = parts[i]; if ((!sPart.endsWith(DIRECTORY_SEPARATOR)) && (i != parts.length - 1)) { sPart += DIRECTORY_SEPARATOR; } sb.append(sPart); } } return sb.toString(); } /** * Delete a Directory with all of its content * * @param Directory * to Delete * @return true if successful, otherwise false */ public static boolean deleteDirectory(File path){ if (path.exists()) { File[] files = path.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { deleteDirectory(files[i]); } else { files[i].delete(); } } } return (path.delete()); } /** * Überprüft, ob Verzeichnis existiert. Falls nicht, wird probiert, das Verzeichnis zu * erstellen. * * @param path * , darf nicht null sein. */ public static void checkCreatePath(final String path) throws IllegalArgumentException{ File dir = new File(path); if (dir.exists()) { if (!dir.isDirectory()) { throw new IllegalArgumentException(Messages .getString("UtilFile.error.msg.invalidPath"), null); //$NON-NLS-1$ } } else { if (!dir.mkdirs()) { String msg = MessageFormat.format(Messages.getString("UtilFile.error.msg.creationFailed"), //$NON-NLS-1$ new Object[] { path }); throw new IllegalArgumentException(msg, null); } } } }