package org.emdev.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import org.emdev.ui.progress.IProgressIndicator;
public final class FileUtils {
private static ArrayList<String> mounts = new ArrayList<String>();
private static ArrayList<String> mountsPR = new ArrayList<String>();
private static ArrayList<String> aliases = new ArrayList<String>();
private static ArrayList<String> aliasesPR = new ArrayList<String>();
static {
File root = new File("/");
File[] rootList = root.listFiles();
if (rootList != null) {
for (final File f : rootList) {
if (f.isDirectory()) {
try {
final String cp = f.getCanonicalPath();
final String ap = f.getAbsolutePath();
if (!cp.equals(ap)) {
aliases.add(ap);
aliasesPR.add(ap + "/");
mounts.add(cp);
mountsPR.add("/");
}
} catch (final IOException ex) {
System.err.println(ex.getMessage());
}
}
}
}
}
private FileUtils() {
}
public static final String getFileSize(final long size) {
if (size > 1073741824) {
return String.format("%.2f", size / 1073741824.0) + " GB";
} else if (size > 1048576) {
return String.format("%.2f", size / 1048576.0) + " MB";
} else if (size > 1024) {
return String.format("%.2f", size / 1024.0) + " KB";
} else {
return size + " B";
}
}
public static final String getFileDate(final long time) {
return new SimpleDateFormat("dd MMM yyyy").format(time);
}
public static final String getAbsolutePath(final File file) {
return file != null ? file.getAbsolutePath() : null;
}
public static final String getCanonicalPath(final File file) {
try {
return file != null ? file.getCanonicalPath() : null;
} catch (final IOException ex) {
return null;
}
}
public static final String invertMountPrefix(final String fileName) {
for (int i = 0, n = Math.min(aliases.size(), mounts.size()); i < n; i++) {
final String alias = aliases.get(i);
final String mount = mounts.get(i);
if (fileName.equals(alias)) {
return mount;
}
if (fileName.equals(mount)) {
return alias;
}
}
for (int i = 0, n = Math.min(aliasesPR.size(), mountsPR.size()); i < n; i++) {
final String alias = aliasesPR.get(i);
final String mount = mountsPR.get(i);
if (fileName.startsWith(alias)) {
return mount + fileName.substring(alias.length());
}
if (fileName.startsWith(mount)) {
return alias + fileName.substring(mount.length());
}
}
return null;
}
public static final String getExtensionWithDot(final File file) {
if (file == null) {
return "";
}
final String name = file.getName();
final int index = name.lastIndexOf(".");
if (index == -1) {
return "";
}
return name.substring(index);
}
public static final FilePath parseFilePath(final String path, final Collection<String> extensions) {
final File file = new File(path);
final FilePath result = new FilePath();
result.path = LengthUtils.safeString(file.getParent());
result.name = file.getName();
for (final String ext : extensions) {
final String dext = "." + ext;
if (result.name.endsWith(dext)) {
result.extWithDot = dext;
result.name = result.name.substring(0, result.name.length() - ext.length() - 1);
break;
}
}
return result;
}
public static void copy(final File source, final File target) throws IOException {
if (!source.exists()) {
return;
}
final long length = source.length();
final int bufsize = MathUtils.adjust((int) length, 1024, 512 * 1024);
final byte[] buf = new byte[bufsize];
int l = 0;
InputStream ins = null;
OutputStream outs = null;
try {
ins = new FileInputStream(source);
outs = new FileOutputStream(target);
for (l = ins.read(buf); l > -1; l = ins.read(buf)) {
outs.write(buf, 0, l);
}
} finally {
if (outs != null) {
try {
outs.close();
} catch (final IOException ex) {
}
}
if (ins != null) {
try {
ins.close();
} catch (final IOException ex) {
}
}
}
}
public static int move(final File sourceDir, final File targetDir, final String[] fileNames,
final IProgressIndicator progress) {
int count = 0;
int processed = 0;
final int updates = Math.max(1, fileNames.length / 20);
boolean renamed = true;
final byte[] buf = new byte[128 * 1024];
int length = 0;
for (final String file : fileNames) {
final File source = new File(sourceDir, file);
final File target = new File(targetDir, file);
processed++;
renamed = renamed && source.renameTo(target);
if (renamed) {
count++;
continue;
}
try {
InputStream ins = null;
OutputStream outs = null;
try {
ins = new FileInputStream(source);
outs = new FileOutputStream(target);
for (length = ins.read(buf); length > -1; length = ins.read(buf)) {
outs.write(buf, 0, length);
}
} finally {
if (outs != null) {
try {
outs.close();
} catch (final IOException ex) {
}
}
if (ins != null) {
try {
ins.close();
} catch (final IOException ex) {
}
}
}
source.delete();
count++;
if (progress != null && (processed % updates) == 0) {
progress.setProgressDialogMessage(0, processed, fileNames.length);
}
} catch (final IOException ex) {
System.err.println(ex.getMessage());
}
}
return count;
}
public static void copy(final InputStream source, final OutputStream target) throws IOException {
ReadableByteChannel in = null;
WritableByteChannel out = null;
try {
in = Channels.newChannel(source);
out = Channels.newChannel(target);
final ByteBuffer buf = ByteBuffer.allocateDirect(512 * 1024);
while (in.read(buf) > 0) {
buf.flip();
out.write(buf);
buf.flip();
}
} finally {
if (out != null) {
try {
out.close();
} catch (final IOException ex) {
}
}
if (in != null) {
try {
in.close();
} catch (final IOException ex) {
}
}
}
}
public static void copy(final InputStream source, final OutputStream target, final int bufsize,
final CopingProgress progress) throws IOException {
ReadableByteChannel in = null;
WritableByteChannel out = null;
try {
in = Channels.newChannel(source);
out = Channels.newChannel(target);
final ByteBuffer buf = ByteBuffer.allocateDirect(bufsize);
long read = 0;
while (in.read(buf) > 0) {
buf.flip();
read += buf.remaining();
if (progress != null) {
progress.progress(read);
}
out.write(buf);
buf.flip();
}
} finally {
if (out != null) {
try {
out.close();
} catch (final IOException ex) {
}
}
if (in != null) {
try {
in.close();
} catch (final IOException ex) {
}
}
}
}
public static interface CopingProgress {
void progress(long bytes);
}
public static final class FilePath {
public String path;
public String name;
public String extWithDot;
public File toFile() {
return new File(path, name + LengthUtils.safeString(extWithDot));
}
}
}