package fr.openwide.core.commons.util;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.filefilter.NameFileFilter;
import com.google.common.collect.Lists;
import de.schlichtherle.truezip.file.TFile;
public final class FileUtils {
public static File getFile(File directory, String name) {
List<File> files = list(directory, new NameFileFilter(name));
if (files.size() == 1) {
return files.get(0);
} else {
throw new IllegalArgumentException("Unable to find file " + name + " in " + directory.getAbsolutePath());
}
}
public static List<File> list(File directory, FilenameFilter filter) {
List<File> files = new ArrayList<File>();
if (directory != null) {
String[] filesPaths = directory.list(filter);
if (filesPaths != null) {
Arrays.sort(filesPaths);
for (int i = 0; i < filesPaths.length; i++) {
TFile file = new TFile(FilenameUtils.concat(directory.getAbsolutePath(), filesPaths[i]));
if (file.canRead()) {
files.add(file);
}
}
} else {
// le résultat filesPaths est null si et seulement si il y a un problème avec la lecture du répertoire
throw new IllegalStateException("Error reading directory: " + directory.getPath());
}
}
return files;
}
public static List<File> listFiles(File directory, FileFilter filter) {
List<File> files = new ArrayList<File>();
if (directory != null) {
File[] filesArray = directory.listFiles(filter);
if (filesArray != null) {
Arrays.sort(filesArray);
for (int i = 0; i < filesArray.length; i++) {
File file = filesArray[i];
if (file.canRead()) {
files.add(file);
}
}
} else {
// le résultat filesPaths est null si et seulement si il y a un problème avec la lecture du répertoire
throw new IllegalStateException("Error reading directory: " + directory.getPath());
}
}
return files;
}
/**
* On contrary to
* {@link org.apache.commons.io.FileUtils#listFiles(File, IOFileFilter, IOFileFilter)} and
* {@link org.apache.commons.io.FileUtils#listFilesAndDirs(File, IOFileFilter, IOFileFilter)}
* , this method returns sub-directories if and only if {@code resultsFilter} allows it.
*
* @param resultsFilter
* Filter for returned files.
* @param recurseFilter
* Filter for recursion into sub-directories. Will be made
* {@link FileFilterUtils#makeDirectoryOnly(IOFileFilter)
* directory only} before use.
*/
public static Collection<File> listRecursively(File directory, IOFileFilter resultsFilter, IOFileFilter recurseFilter) {
Collection<File> results = Lists.newLinkedList();
IOFileFilter effectiveRecurseFilter = FileFilterUtils.makeDirectoryOnly(recurseFilter);
innerListRecursively(results, directory, resultsFilter, effectiveRecurseFilter);
return results;
}
/**
* Based on org.apache.commons.io.FileUtils#cleanDirectory(File directory) but only deletes files older than a
* certain date.
*
* @param directory
* @param onlyCleanFilesOlderThanThisDate
* @throws IOException
*/
public static void cleanDirectory(File directory, Date onlyCleanFilesOlderThanThisDate) throws IOException {
if (!directory.exists()) {
String message = directory + " does not exist";
throw new IllegalArgumentException(message);
}
if (!directory.isDirectory()) {
String message = directory + " is not a directory";
throw new IllegalArgumentException(message);
}
File[] files = directory.listFiles();
if (files == null) { // null if security restricted
throw new IOException("Failed to list contents of " + directory);
}
IOException exception = null;
for (File file : files) {
if (onlyCleanFilesOlderThanThisDate == null || onlyCleanFilesOlderThanThisDate.after(new Date(file.lastModified()))) {
try {
org.apache.commons.io.FileUtils.forceDelete(file);
} catch (IOException ioe) {
exception = ioe;
}
}
}
if (null != exception) {
throw exception;
}
}
private static void innerListRecursively(Collection<File> results, File directory, IOFileFilter resultsFilter, IOFileFilter recurseFilter) {
List<File> found = listFiles(directory, resultsFilter);
results.addAll(found);
List<File> recursedSubdirectories = listFiles(directory, recurseFilter);
for (File recursedSubdirectory : recursedSubdirectories) {
innerListRecursively(results, recursedSubdirectory, resultsFilter, recurseFilter);
}
}
private FileUtils() {
}
}