|
|
|
@ -23,8 +23,8 @@ import mightypork.utils.string.validation.StringFilter; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class FileUtil { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Copy directory recursively. |
|
|
|
|
* |
|
|
|
@ -36,8 +36,8 @@ public class FileUtil { |
|
|
|
|
{ |
|
|
|
|
copyDirectory(source, target, null, null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Copy directory recursively - advanced variant. |
|
|
|
|
* |
|
|
|
@ -50,28 +50,28 @@ public class FileUtil { |
|
|
|
|
public static void copyDirectory(File source, File target, FileFilter filter, List<File> filesCopied) throws IOException |
|
|
|
|
{ |
|
|
|
|
if (!source.exists()) return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (source.isDirectory()) { |
|
|
|
|
if (!target.exists() && !target.mkdir()) { |
|
|
|
|
throw new IOException("Could not open destination directory."); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final String[] children = source.list(); |
|
|
|
|
for (final String element : children) { |
|
|
|
|
copyDirectory(new File(source, element), new File(target, element), filter, filesCopied); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
if (filter != null && !filter.accept(source)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (filesCopied != null) filesCopied.add(target); |
|
|
|
|
copyFile(source, target); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* List directory recursively |
|
|
|
|
* |
|
|
|
@ -87,17 +87,17 @@ public class FileUtil { |
|
|
|
|
for (final String element : children) { |
|
|
|
|
listDirectoryRecursive(new File(source, element), filter, files); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
if (filter != null && !filter.isValid(source.getAbsolutePath())) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
files.add(source); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Copy file using streams. Make sure target directory exists! |
|
|
|
|
* |
|
|
|
@ -107,15 +107,15 @@ public class FileUtil { |
|
|
|
|
*/ |
|
|
|
|
public static void copyFile(File source, File target) throws IOException |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try(InputStream in = new FileInputStream(source); |
|
|
|
|
OutputStream out = new FileOutputStream(target)) { |
|
|
|
|
|
|
|
|
|
OutputStream out = new FileOutputStream(target)) { |
|
|
|
|
|
|
|
|
|
copyStream(in, out); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Copy bytes from input to output stream, leaving out stream open |
|
|
|
|
* |
|
|
|
@ -128,19 +128,19 @@ public class FileUtil { |
|
|
|
|
if (in == null) { |
|
|
|
|
throw new NullPointerException("Input stream is null"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (out == null) { |
|
|
|
|
throw new NullPointerException("Output stream is null"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final byte[] buf = new byte[2048]; |
|
|
|
|
int len; |
|
|
|
|
while ((len = in.read(buf)) > 0) { |
|
|
|
|
out.write(buf, 0, len); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Improved delete |
|
|
|
|
* |
|
|
|
@ -153,18 +153,18 @@ public class FileUtil { |
|
|
|
|
if (!path.exists()) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!recursive || !path.isDirectory()) return path.delete(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final String[] list = path.list(); |
|
|
|
|
for (int i = 0; i < list.length; i++) { |
|
|
|
|
if (!delete(new File(path, list[i]), true)) return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return path.delete(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Read entire file to a string. |
|
|
|
|
* |
|
|
|
@ -175,12 +175,12 @@ public class FileUtil { |
|
|
|
|
public static String fileToString(File file) throws IOException |
|
|
|
|
{ |
|
|
|
|
try(FileInputStream fin = new FileInputStream(file)) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return streamToString(fin); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Get files in a folder (create folder if needed) |
|
|
|
|
* |
|
|
|
@ -191,8 +191,8 @@ public class FileUtil { |
|
|
|
|
{ |
|
|
|
|
return FileUtil.listDirectory(dir, null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Get files in a folder (create folder if needed) |
|
|
|
|
* |
|
|
|
@ -203,17 +203,17 @@ public class FileUtil { |
|
|
|
|
public static List<File> listDirectory(File dir, FileFilter filter) |
|
|
|
|
{ |
|
|
|
|
dir.mkdir(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final List<File> list = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (final File f : dir.listFiles(filter)) { |
|
|
|
|
list.add(f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return list; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Remove extension. |
|
|
|
|
* |
|
|
|
@ -224,20 +224,20 @@ public class FileUtil { |
|
|
|
|
{ |
|
|
|
|
return getFilenameParts(file.getName()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static String getExtension(File file) |
|
|
|
|
{ |
|
|
|
|
return getExtension(file.getName()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static String getExtension(String file) |
|
|
|
|
{ |
|
|
|
|
return StringUtil.fromLastChar(file, '.'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Remove extension. |
|
|
|
|
* |
|
|
|
@ -247,24 +247,24 @@ public class FileUtil { |
|
|
|
|
public static String[] getFilenameParts(String filename) |
|
|
|
|
{ |
|
|
|
|
String ext, name; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
ext = StringUtil.fromLastDot(filename); |
|
|
|
|
} catch (final StringIndexOutOfBoundsException e) { |
|
|
|
|
ext = ""; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
name = StringUtil.toLastDot(filename); |
|
|
|
|
} catch (final StringIndexOutOfBoundsException e) { |
|
|
|
|
name = ""; |
|
|
|
|
Log.w("Error extracting extension from file " + filename); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return new String[] { name, ext }; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Read entire input stream to a string, and close it. |
|
|
|
|
* |
|
|
|
@ -275,8 +275,8 @@ public class FileUtil { |
|
|
|
|
{ |
|
|
|
|
return streamToString(in, -1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Read input stream to a string, and close it. |
|
|
|
|
* |
|
|
|
@ -290,10 +290,10 @@ public class FileUtil { |
|
|
|
|
Log.e(new NullPointerException("Null stream to be converted to String.")); |
|
|
|
|
return ""; // to avoid NPE's
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BufferedReader br = null; |
|
|
|
|
final StringBuilder sb = new StringBuilder(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String line; |
|
|
|
|
try { |
|
|
|
|
int cnt = 0; |
|
|
|
@ -302,11 +302,11 @@ public class FileUtil { |
|
|
|
|
sb.append(line + "\n"); |
|
|
|
|
cnt++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (cnt == lines && lines > 0) { |
|
|
|
|
sb.append("--- end of preview ---\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} catch (final IOException e) { |
|
|
|
|
Log.e(e); |
|
|
|
|
} finally { |
|
|
|
@ -316,15 +316,15 @@ public class FileUtil { |
|
|
|
|
// ignore
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return sb.toString(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static InputStream stringToStream(String text) |
|
|
|
|
{ |
|
|
|
|
if (text == null) return null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
return new ByteArrayInputStream(text.getBytes("UTF-8")); |
|
|
|
|
} catch (final UnsupportedEncodingException e) { |
|
|
|
@ -332,30 +332,38 @@ public class FileUtil { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static InputStream getResource(String path) |
|
|
|
|
{ |
|
|
|
|
final InputStream in = FileUtil.class.getResourceAsStream(path); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (in != null) return in; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
return new FileInputStream(WorkDir.getFile(path)); |
|
|
|
|
return new FileInputStream(new File(".", path)); |
|
|
|
|
|
|
|
|
|
} catch (final FileNotFoundException e) { |
|
|
|
|
Log.w("Could not open resource stream: " + path); |
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
return new FileInputStream(WorkDir.getFile(path)); |
|
|
|
|
|
|
|
|
|
} catch (final FileNotFoundException e2) { |
|
|
|
|
Log.w("Could not open resource stream, file not found: " + path); |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static String getResourceAsString(String path) |
|
|
|
|
{ |
|
|
|
|
return streamToString(getResource(path)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Save string to file |
|
|
|
|
* |
|
|
|
@ -366,44 +374,44 @@ public class FileUtil { |
|
|
|
|
public static void stringToFile(File file, String text) throws IOException |
|
|
|
|
{ |
|
|
|
|
try(PrintStream out = new PrintStream(new FileOutputStream(file), false, "UTF-8")) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
out.print(text); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
out.flush(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void deleteEmptyDirs(File base) throws IOException |
|
|
|
|
{ |
|
|
|
|
for (final File f : listDirectory(base)) { |
|
|
|
|
if (!f.isDirectory()) continue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
deleteEmptyDirs(f); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final List<File> children = listDirectory(f); |
|
|
|
|
if (children.size() == 0) { |
|
|
|
|
if (!f.delete()) throw new IOException("Could not delete a directory: " + f); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static String getBasename(String name) |
|
|
|
|
{ |
|
|
|
|
return StringUtil.toLastChar(StringUtil.fromLastChar(name, '/'), '.'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static String getFilename(String name) |
|
|
|
|
{ |
|
|
|
|
return StringUtil.fromLastChar(name, '/'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Copy resource to file |
|
|
|
|
* |
|
|
|
@ -414,14 +422,14 @@ public class FileUtil { |
|
|
|
|
public static void resourceToFile(String resname, File file) throws IOException |
|
|
|
|
{ |
|
|
|
|
try(InputStream in = FileUtil.getResource(resname); |
|
|
|
|
OutputStream out = new FileOutputStream(file)) { |
|
|
|
|
|
|
|
|
|
OutputStream out = new FileOutputStream(file)) { |
|
|
|
|
|
|
|
|
|
FileUtil.copyStream(in, out); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Get resource as string, safely closing streams. |
|
|
|
|
* |
|
|
|
|