/*******************************************************************************
* Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0-standalone.html
******************************************************************************/
package se.unlogic.standardutils.io;
import se.unlogic.standardutils.callback.Callback;
import se.unlogic.standardutils.streams.StreamUtils;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Utility class for handling files and folders
*
* @author Robert "Unlogic" Olofsson (unlogic@unlogic.se)
*
*/
public class FileUtils {
public static String toAsciiFilename(String string) {
return string.replaceAll("[^0-9a-zA-Z-.]", "_");
}
public static String toValidHttpFilename(String string) {
return string.replaceAll("[^0-9a-�A-�-+. ()-+!@�&%$�=�]", "_");
}
public final static byte[] getRawBytes(File f) throws IOException {
FileInputStream fin = new FileInputStream(f);
byte[] buffer = new byte[(int) f.length()];
fin.read(buffer);
fin.close();
return buffer;
}
public static String getFileExtension(File file) {
return getFileExtension(file.getName());
}
public static String getFileExtension(String filename) {
int dotIndex = filename.lastIndexOf(".");
if (dotIndex == -1 || (dotIndex + 1) == filename.length()) {
return null;
} else {
return filename.substring(dotIndex + 1);
}
}
public static boolean fileExists(String path) {
File file = new File(path);
return file.exists();
}
/**
* Removes all files in the given directory matching the given filter
*
* @param directory
* the directory to be cleared
* @param filter
* {@link FileFilter} used to filter files
* @param recursive
* controls weather files should be deleted from sub directories too
*/
public static int deleteFiles(String directory, FileFilter filter, boolean recursive) {
return deleteFiles(new File(directory), filter, recursive);
}
public static int deleteFiles(File dir, FileFilter filter, boolean recursive) {
if (dir.exists() && dir.isDirectory()) {
int deletedFiles = 0;
File[] files = dir.listFiles(filter);
for (File file : files) {
if (file.isDirectory()) {
if (recursive) {
deletedFiles += deleteFiles(file, filter, recursive);
}
} else {
if(file.delete()){
deletedFiles++;
}
}
}
return deletedFiles;
}
return 0;
}
public static int replace(File dir, String filename, File replacementFile, boolean recursive, boolean caseSensitive, Callback<File> callback) {
if (dir.exists() && dir.isDirectory()) {
int replacedFiles = 0;
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
if (recursive) {
replacedFiles += replace(file, filename,replacementFile, recursive, caseSensitive, callback);
}
} else {
if(caseSensitive){
if(!file.getName().equals(filename)){
continue;
}
}else if(!file.getName().equalsIgnoreCase(filename)){
continue;
}
if(file.canWrite()){
try {
if(callback != null){
callback.callback(file);
}
replaceFile(file,replacementFile);
replacedFiles++;
} catch (IOException e) {}
}
}
}
return replacedFiles;
}
return 0;
}
public static void replaceFile(File target, File replacement) throws IOException {
FileInputStream inputStream = null;
FileOutputStream outputStream = null;
try{
inputStream = new FileInputStream(replacement);
outputStream = new FileOutputStream(target);
inputStream.getChannel().transferTo(0, replacement.length(), outputStream.getChannel());
StreamUtils.transfer(inputStream, outputStream);
}finally{
StreamUtils.closeStream(inputStream);
StreamUtils.closeStream(outputStream);
}
}
public static boolean deleteDirectory(String directoryPath) {
return deleteDirectory(new File(directoryPath));
}
public static boolean deleteDirectory(File directory) {
if (directory.exists()) {
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
deleteDirectory(file);
} else {
file.delete();
}
}
}
return directory.delete();
}
public static void deleteFile(String path) {
File file = new File(path);
if(file.exists()){
file.delete();
}
}
}