X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fcommons%2Ffile%2FIOHelper.java;h=01c08370a6a810fea4d85c12429fda706760d24d;hb=4620f886089bd4d16a4affa46e05dd4d4688223b;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));
+ }
}