X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fcommons%2Ffile%2FIOHelper.java;h=01c08370a6a810fea4d85c12429fda706760d24d;hb=b46b1b0c0ded3377fb44d88fe4105ffebc8ee152;hp=97d3b44252e0d9f99fb42f6a32d9c7ba1c9c09a2;hpb=26f09b1ebcafae67855b55ad588d5332a107d202;p=svjatoslav_commons.git diff --git a/src/main/java/eu/svjatoslav/commons/file/IOHelper.java b/src/main/java/eu/svjatoslav/commons/file/IOHelper.java old mode 100644 new mode 100755 index 97d3b44..01c0837 --- a/src/main/java/eu/svjatoslav/commons/file/IOHelper.java +++ b/src/main/java/eu/svjatoslav/commons/file/IOHelper.java @@ -1,66 +1,123 @@ /* - * Svjatoslav Commons - shared library of common functionality. - * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public License - * as published by the Free Software Foundation. + * Svjatoslav Commons - shared library of common functionality. Author: Svjatoslav Agejenko. + * This project is released under Creative Commons Zero (CC0) license. */ - package eu.svjatoslav.commons.file; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; +import java.io.*; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.nio.file.Files.isSymbolicLink; public class IOHelper { - public static byte[] getFileContents(final File file) - throws FileNotFoundException, IOException { - - final byte[] result = new byte[(int) file.length()]; - final FileInputStream fileInputStream = new FileInputStream(file); - fileInputStream.read(result); - fileInputStream.close(); - return result; - } - - /** - * Compares new file content with old file content. If content in equal, - * then leaves file as-is. If content differs, then overrides file with the - * new content. - * - * @return true if file was overwritten. - */ - public static boolean overwriteFileIfContentDiffers(final File file, - final byte[] newContent) throws FileNotFoundException, IOException { - - checkForEquality: { - if (file.length() == newContent.length) { - - final byte[] oldContent = getFileContents(file); - - for (int i = 0; i < newContent.length; i++) - if (newContent[i] != oldContent[i]) - break checkForEquality; - - // new file content in identical to old content - return false; - } - } - - // New content differs from existing. Overwrite file. - saveToFile(file, newContent); - return true; - } - - public static void saveToFile(final File file, final byte[] content) - throws IOException { - final FileOutputStream fos = new FileOutputStream(file); - fos.write(content); - fos.close(); - } + /** + * Deletes files and directories recursively. Does not follow symlinks. + * + * @param file directory to delete with entire contents. + * @throws IOException if filesystem error happens + */ + public static void deleteRecursively(final File file) throws IOException { + + if (file.isDirectory()) { + deleteDirectory(file); + return; + } + + if (file.isFile()){ + if (!file.delete()) throw new IOException("Failed to delete file: " + file); + } else { + if (isSymbolicLink(file.toPath()) && !file.delete()) + throw new IOException("Failed to delete symlink: " + file); + } + } + + private static void deleteDirectory(File file) throws IOException { + // if file is symlink that points to directory, no not touch content + if (!isSymbolicLink(file.toPath())){ + File[] files = file.listFiles(); + if (files == null) + throw new IOException("Failed to read directory content for: " + + file); + + for (final File subFile : files) + deleteRecursively(subFile); + } + + if (!file.delete()) + throw new IOException("Failed to delete directory: " + file); + } + + public static byte[] getFileContents(final File file) + throws IOException { + + final byte[] result = new byte[(int) file.length()]; + try (final FileInputStream fileInputStream = new FileInputStream(file)) { + if (fileInputStream.read(result) != result.length) + throw new RuntimeException("Could not read file content:" + file); + } + return result; + } + + /** + * Expects file content to be in UTF-8 encoding. + * @param file file to read + * @return File content + * @throws IOException when file reading fails. + */ + public static String getFileContentsAsString(final File file) + throws IOException { + try { + return new String(getFileContents(file), UTF_8); + } catch (final UnsupportedEncodingException exception) { + throw new RuntimeException(exception); + } + } + + /** + * Compares new file content with old file content. If content in equal, + * then leaves file as-is. If content differs, then overrides file with the + * new content. + * + * @param file file to potentially overwrite + * @param newContent new content + * @return true if file was overwritten. + * @throws FileNotFoundException if file is not found. + * @throws IOException if error happens during file IO. + */ + public static boolean overwriteFileIfContentDiffers(final File file, + final byte[] newContent) throws IOException { + + checkForEquality: + { + if (file.length() == newContent.length) { + + final byte[] oldContent = getFileContents(file); + + for (int i = 0; i < newContent.length; i++) + if (newContent[i] != oldContent[i]) + break checkForEquality; + + // new file content in identical to old content + return false; + } + } + + // New content differs from existing. Overwrite file. + saveToFile(file, newContent); + return true; + } + + public static void saveToFile(final File file, final byte[] content) + throws IOException { + try (final FileOutputStream fos = new FileOutputStream(file)) { + fos.write(content); + } + } + + public static void saveToFile(final File file, final String content) + throws IOException { + saveToFile(file, content.getBytes(UTF_8)); + } }