package com.googlecode.mycontainer.commons.file; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.Arrays; import java.util.Comparator; import com.googlecode.mycontainer.commons.io.IOUtil; public class FileComparator implements Comparator<File>, FileFilter { private FileFilter filter = this; public FileFilter getFilter() { return filter; } public void setFilter(FileFilter filter) { this.filter = filter; } public int compare(File f1, File f2) { InputStream in1 = null; InputStream in2 = null; try { boolean f1Exists = f1.exists(); boolean f2Exists = f2.exists(); if (f1Exists != f2Exists) { return f1Exists ? -1 : 1; } if (!f1Exists && !f2Exists) { return 0; } boolean isDir1 = f1.isDirectory(); boolean isDir2 = f2.isDirectory(); if (isDir1 != isDir2) { return isDir1 ? -1 : 1; } if (!isDir1) { in1 = new FileInputStream(f1); in2 = new FileInputStream(f2); return IOUtil.compare(in1, in2); } File[] files1 = f1.listFiles(filter); File[] files2 = f2.listFiles(filter); int ret = files1.length - files2.length; if (ret != 0) { return ret; } Arrays.sort(files1); Arrays.sort(files2); for (int i = 0; i < files1.length; i++) { File child1 = files1[i]; File child2 = files2[i]; ret = compare(child1, child2); if (ret != 0) { return ret; } } return 0; } catch (FileNotFoundException e) { throw new RuntimeException(e); } finally { IOUtil.close(in1); IOUtil.close(in2); } } public boolean accept(File file) { return true; } }