package net.sourceforge.solexatools.util; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * <p> * FileFinder class. * </p> * * @author boconnor * @version $Id: $Id */ public class FileFinder { private Pattern p = null; private Matcher m = null; private long totalLength = 0; private long filesNumber = 0; private long directoriesNumber = 0; private final int FILES = 0; private final int DIRECTORIES = 1; private final int ALL = 2; /** * <p> * Constructor for FileFinder. * </p> */ public FileFinder() { } /** * <p> * Constructor for FileFinder. * </p> * * @param p * a {@link java.util.regex.Pattern} object. */ public FileFinder(Pattern p) { this.p = p; } /** * <p> * findAll. * </p> * * @param startPath * a {@link java.lang.String} object. * @return a {@link java.util.List} object. * @throws java.lang.Exception * if any. */ public List findAll(String startPath) throws Exception { return find(startPath, "", ALL); } /** * <p> * findAll. * </p> * * @param startPath * a {@link java.lang.String} object. * @param mask * a {@link java.lang.String} object. * @return a {@link java.util.List} object. * @throws java.lang.Exception * if any. */ public List findAll(String startPath, String mask) throws Exception { return find(startPath, mask, ALL); } /** * <p> * findFiles. * </p> * * @param startPath * a {@link java.lang.String} object. * @return a {@link java.util.List} object. * @throws java.lang.Exception * if any. */ public List findFiles(String startPath) throws Exception { return find(startPath, "", FILES); } /** * <p> * findFiles. * </p> * * @param startPath * a {@link java.lang.String} object. * @param mask * a {@link java.lang.String} object. * @return a {@link java.util.List} object. * @throws java.lang.Exception * if any. */ public List findFiles(String startPath, String mask) throws Exception { return find(startPath, mask, FILES); } /** * <p> * findDirectories. * </p> * * @param startPath * a {@link java.lang.String} object. * @return a {@link java.util.List} object. * @throws java.lang.Exception * if any. */ public List findDirectories(String startPath) throws Exception { return find(startPath, "", DIRECTORIES); } /** * <p> * findDirectories. * </p> * * @param startPath * a {@link java.lang.String} object. * @param mask * a {@link java.lang.String} object. * @return a {@link java.util.List} object. * @throws java.lang.Exception * if any. */ public List findDirectories(String startPath, String mask) throws Exception { return find(startPath, mask, DIRECTORIES); } /** * <p> * getDirectorySize. * </p> * * @return a long. */ public long getDirectorySize() { return totalLength; } /** * <p> * Getter for the field <code>filesNumber</code>. * </p> * * @return a long. */ public long getFilesNumber() { return filesNumber; } /** * <p> * Getter for the field <code>directoriesNumber</code>. * </p> * * @return a long. */ public long getDirectoriesNumber() { return directoriesNumber; } private boolean accept(String name) { if (p == null) { return true; } m = p.matcher(name); if (m.matches()) { return true; } else { return false; } } private List find(String startPath, String mask, int objectType) throws Exception { if (startPath == null || mask == null) { throw new Exception("Error: dont set params"); } File topDirectory = new File(startPath); if (!topDirectory.exists()) { throw new Exception("Error: Directory dont exists"); } if (!mask.isEmpty()) { p = Pattern.compile(mask, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); } filesNumber = 0; directoriesNumber = 0; totalLength = 0; ArrayList res = new ArrayList(100); search(topDirectory, res, objectType); p = null; return res; } private void search(File topDirectory, List res, int objectType) { File[] list = topDirectory.listFiles(); for (File list1 : list) { if (list1.isDirectory()) { if (objectType != FILES && accept(list1.getName())) { directoriesNumber++; res.add(list1); } search(list1, res, objectType); } else { if (objectType != DIRECTORIES && accept(list1.getName())) { filesNumber++; totalLength += list1.length(); res.add(list1); } } } } }