package org.objectstyle.wolips.baseforplugins.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
public class FileUtilities {
public static boolean deleteRecursively(File file) {
if (file.isDirectory()) {
File[] childFiles = file.listFiles();
if (childFiles != null) {
for (File childFile : childFiles) {
deleteRecursively(childFile);
}
}
}
return file.delete();
}
/**
* Copys the source file to the destination (copied from ERXFileUtilities)
*
* @param srcFile source file
* @param dstFile destination file
* @param deleteOriginals tells if original file will be deleted. Note that if the appuser has no write rights
* on the file it is NOT deleted unless force delete is true
* @param forceDelete if true then missing write rights are ignored and the file is deleted.
*/
public static void copyFileToFile(File srcFile, File dstFile, boolean deleteOriginals, boolean forceDelete) throws FileNotFoundException, IOException {
if (srcFile.exists() && srcFile.isFile()) {
boolean copied = false;
if (deleteOriginals && (!forceDelete || srcFile.canWrite())) {
copied = srcFile.renameTo(dstFile);
}
if (!copied) {
Throwable thrownException = null;
File parent = dstFile.getParentFile();
if (!parent.exists() && !parent.mkdirs()) {
throw new IOException("Failed to create the directory " + parent + ".");
}
FileInputStream in = new FileInputStream(srcFile);
try {
// Create channel on the source
FileChannel srcChannel = in.getChannel();
try {
FileOutputStream out = new FileOutputStream(dstFile);
try {
// Create channel on the destination
FileChannel dstChannel = out.getChannel();
try {
// Copy file contents from source to destination
dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
}
catch (Throwable t) {
thrownException = t;
}
finally {
dstChannel.close();
}
}
catch (Throwable t) {
if (thrownException == null) {
thrownException = t;
}
}
finally {
out.close();
}
}
catch (Throwable t) {
if (thrownException == null) {
thrownException = t;
}
}
finally {
srcChannel.close();
}
} catch (Throwable t) {
if (thrownException == null) {
thrownException = t;
}
}
finally {
try {
in.close();
}
catch (IOException e) {
if (thrownException == null) {
thrownException = e;
}
}
}
if (deleteOriginals && (srcFile.canWrite() || forceDelete)) {
if (!srcFile.delete()) {
throw new IOException("Failed to delete " + srcFile + ".");
}
}
if (thrownException != null) {
if (thrownException instanceof IOException) {
throw (IOException)thrownException;
}
else if (thrownException instanceof Error) {
throw (Error)thrownException;
}
else {
throw (RuntimeException)thrownException;
}
}
}
}
}
}