package org.fastcatsearch.util; import java.io.File; import java.io.FileFilter; import java.util.ArrayDeque; import java.util.Deque; import java.util.Enumeration; public class DirectoryFileEnumeration implements Enumeration<File> { //최종결과 파일들. private Deque<File> resultQueue; //중간 디렉토리들. private Deque<File> directoryQueue; //최종결과 파일 선별시 사용되는 filter private FileFilter resultFileFilter; public DirectoryFileEnumeration(File root, FileFilter resultFileFilter) { this.resultFileFilter = resultFileFilter; resultQueue = new ArrayDeque<File>(); directoryQueue = new ArrayDeque<File>(); directoryQueue.addLast(root); } public int getDirectoryQueueSize(){ return directoryQueue.size(); } @Override public boolean hasMoreElements() { while (resultQueue.size() == 0) { if (directoryQueue.size() == 0) { // 파일도 없고 디렉토리도 없으면 탐색 끝. return false; } else { File dir = directoryQueue.pollFirst(); if(resultFileFilter != null && resultFileFilter.accept(dir)){ resultQueue.addLast(dir); } //listFile호출시 resultFileFilter를 적용하지 않는다. //만약 filter에 directory를 제외하는 로직이 있다면 하위 디렉토리 탐색이 불가능해진다. for (File f : dir.listFiles()) { if (f.isDirectory()) { directoryQueue.addLast(f); } else { //결과file선별시에만 resultFileFilter를 적용한다. if(resultFileFilter != null && resultFileFilter.accept(f)){ resultQueue.addLast(f); } } } } } return resultQueue.size() > 0; } @Override public File nextElement() { return resultQueue.pollFirst(); } }