2009-07-07 6 views
8

Я пытаюсь понять, как использовать apache commons io DirectoryWalker. Довольно легко понять, как подкласс DirectoryWalker. Но как вы начнете выполнять его в определенном каталоге?using DirectoryWalker

ответ

7

Похоже, что подкласс должен предоставлять общедоступный метод, который вызывает walk().

+0

argh !!! конечно, как @ # $ @ # $ @ # я пропустил, увидев это? –

+1

не ненавидите, когда это происходит. < – Nippysaurus

+0

На самом деле, похоже, вам не нужно предоставлять метод, который вызывает прогулку. другой класс может вызвать walk() извне. –

11

Просто для того, чтобы расширить этот ответ, так как сначала я был озадачен тем, как использовать этот класс, и этот вопрос возник на google, когда я оглядывался. Это просто пример того, как я использовал его (минус некоторые вещи):

public class FindConfigFilesDirectoryWalker extends DirectoryWalker { 
    private static String rootFolder = "/xml_files"; 
    private Logger log = Logger.getLogger(getClass()); 

    private static IOFileFilter filter = FileFilterUtils.andFileFilter(FileFilterUtils.fileFileFilter(), 
      FileFilterUtils.suffixFileFilter("xml")); 

    public FeedFileDirectoryWalker() { 
     super(filter, -1); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void handleFile(final File file, final int depth, final Collection results) throws IOException { 
     log.debug("Found file: " + file.getAbsolutePath()); 
     results.add(file); 
    } 

    public List<File> getFiles() { 
     List<File> files = new ArrayList<File>(); 

     URL url = getClass().getResource(rootFolder); 

     if (url == null) { 
      log.warn("Unable to find root folder of configuration files!"); 
      return files; 
     } 

     File directory = new File(url.getFile()); 

     try { 
      walk(directory, files); 
     } 
     catch (IOException e) { 
      log.error("Problem finding configuration files!", e); 
     } 

     return files; 
    } 
} 

И тогда вы бы просто вызвать его с помощью открытого метода вы создали, передавая любые аргументы, которые вы можете:

List<File> files = new FindConfigFilesDirectoryWalker().getFiles(); 
+0

Обратите внимание, что для getResource() требуется, чтобы папка ресурса находилась в пути сборки. Далее описано: http://lj4newbies.blogspot.com/2008/03/using-classgetresource-load-resource.html – dbasch

1

Все, что я хотел, это набор каталогов для повторения. Этот подкласс предоставил то, что мне было нужно:

public class UDirWalker extends DirectoryWalker { 
    public UDirWalker() { 
     super(); 
    } 

    public ArrayList<File> getDirectories(File startDirectory) throws IOException { 
     ArrayList<File> dirs = new ArrayList<File>(); 
     walk(startDirectory, dirs); 
     return dirs; 
    } 

    @Override 
    protected boolean handleDirectory(File directory, int depth, 
     Collection results) { 
     results.add(directory); 
     return true; 
    } 
}