[JAVA] 자바 재귀호출을 이용한 하위 디렉토리 검색하기

류명운

·

2015. 5. 6. 22:24

반응형

[JAVA] 자바 재귀호출을 이용한 하위 디렉토리 검색하기


디렉토리를 지우기에 앞서 디렉토리 안에 하위 디렉토리 혹은 파일들이 존재하는지를 알아봐야 한다. 

* 디렉토리에 하위 파일, 디렉토리가 존재할 경우 해당 디렉토리가 삭제되지 않는다.

File 클래스에는 isFile() 메소드가 있어서 이를 이용하면 하위 파일 및 디렉토리에 접근할 수가 있는데, 하위 디렉토리의 하위 디렉토리가 또 파일 혹은 디렉토리를 가질 경우 같이 아래로 자식들이 계속해서 있는 경우가 많으므로 디렉토리에 내려올 경우, 하위에 또 다른 자식들이 있는지 여부를 체크해야 한다. 

* 본 포스팅에서는 재귀 호출을 이용한 탐색을 하여 파일들을 가져온다.


RecursiveExplorer.java

public class RecursiveExplorer {
	public static void main(String[] args) 
      { 
          File f= new File(“d:\\test”); 
          ArrayList<File> subFiles= new ArrayList<File>(); 
           
          if(!f.exists()) 
          { 
             System.out.println(“디렉토리가 존재하지 않습니다”); 
             return; 
          } 
           
          findSubFiles(f, subFiles); 
           
          System.out.println(“———————————-“); 
           
          for(File file : subFiles) 
          { 
              if(file.isFile()) 
              { 
                  System.out.println(“파일 이름 : “+file.getName()); 
                  try{ 
                      System.out.println(“파일 경로 : “+file.getCanonicalPath()); 
                  }catch(Exception e){ 
                      e.printStackTrace(); 
                  } 
                  System.out.println(“파일 크기 : “+file.length()); 
                  System.out.println(“———————————-“); 
              } 
              else if(file.isDirectory()) 
              { 
                  System.out.println(“디렉토리 이름 : “+file.getName()); 
                  try{ 
                      System.out.println(“디렉토리 경로 : “+file.getCanonicalPath()); 
                  }catch(Exception e){ 
                      e.printStackTrace(); 
                  } 
                  System.out.println(“———————————-“); 
              } 
          } 
      }

	public static void findSubFiles(File parentFile, ArrayList<File> subFiles) {
		if (parentFile.isFile()) {
			subFiles.add(parentFile);
		} else if (parentFile.isDirectory()) {
			subFiles.add(parentFile);
			File[] childFiles = parentFile.listFiles();
			for (File childFile : childFiles) {
				findSubFiles(childFile, subFiles);
			}
		}
	}
}
  • 5~6 : 탐색을 할 디렉토리의 경로를 지정해주고, 하위 자식들을 저장할 ArrayList subFile을 선언했다.
  • 18~41 : 재귀 호출을 통하여 얻은 자식 File 객체들이 담긴 ArrayList subFile에서 File 객체를 하나씩 접근하며 파일 이름, 파일 경로, 파일 크기 등의 정보를 출력하고 있다. 이때 isFile(), isDirectory() 메소드를 통하여 해당 파일 객체가 파일인지 디렉토리인지 여부를 판단했다. 파일의 삭제 등등 기타 작업을 할 때도 이 ArrayList를 이용하면 된다.
  • 44~59 : 파일 객체를 담는 함수. 파라미터로 받은 File 객체가 일반 파일이면 바로 (역시 파라미터로 건네받은) ArrayList에 저장하고, 디렉토리이면 ArrayList에 저장 후에 해당 디렉토리를 argument로 다시 자기 자신(findSubFiles)을 다시 호출함으로써 해당 디렉토리로부터 탐색을 다시 시작하게 된다.


* 위 탐색을 하면서 결과적으로 ArrayList에 원래 지정했던 디렉토리 경로 아래의 모든 디렉토리, 파일 객체가 담겨지게 된다. 재귀호출을 이용했기에 많은양의 파일, 디렉토리가 있을 경우 메모리가 부족해져 프로그램이 죽을 수도 있다.


반응형