Language/Java

[Java] 자바로 지정한 폴더 및 하위 폴더 탐색(재귀적 함수)

The Neo 2020. 11. 29. 13:44

Java는 파일 객체를 다룰 수 있는 File이라는 클래스를 제공한다. 이를 통해 다양한 파일 컨트롤을 할 수 있는데 아주 기본적이고 기초적이면서 프로그램 전공이 아닌 사람들은 힘들어 하는 재귀 함수(Recursive function)에 대해서 작성해보도록 한다.

 

재귀 함수는 메소드가 자신을 계속 호출하는 즉 재귀호출 기능이 있는 함수를 말한다. 이를 통해 하위 Depth의 값들을 처리할 수 있다. parent code가 있고 child code가 있을 경우 child code는 parent code를 탐색하며 재귀 호출을 할 수도 있고 그 반대로 처리하여 하위 Depth로 내려갈 수도 있다. 

 

 

백문이불여일타니 아래의 소스코드를 이해해보도록 한다.

 

재귀함수로 파일 스캔

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class main {
	public static void main(String[] args) {
		List<String> fileLst = new ArrayList<String> ();
		
		scanDir("c:/cleardir", fileLst);	// 필자가 만든 폴더이다
		
		for(String fullPath : fileLst) {
			System.out.println(fullPath);
		}		
	}	
	
	
	/**
	 * 재귀 호출을 이용하여 하위 폴더를 탐색한다 
	 * @param folderPath
	 */
	public static void scanDir(String folderPath, List<String> fileLst) {
		File[] files = new File(folderPath).listFiles();
		
		for(File f : files) {
			if(f.isDirectory()) {
				scanDir(f.getAbsolutePath(), fileLst);
			} else {
				fileLst.add(f.getAbsolutePath());
			}
		}
	}
}

코드 설명

1. String 형으로 된 리스트, fileLst 생성
2. scanDir에는 첫번째는 부모 디렉토리(Parent Directory) 문자열과 fileLst를 인수값으로 전달
3. scanDir에는 parent directory 기준 현재 폴더의 모든 파일과 폴더값을 File[] files라는 변수에 저장
4. files를 loop 돌며, 디렉토리일 경우 디렉토리의 path값을 다시 scanDir에 호출하여 재귀호출 수행
5. 디렉토리가 아니라 파일일 경우 현재의 파일 경로를 fileLst에 담음

위 코드 설명처럼 폴더일 경우 scanDir를 호출하여 더이상 폴더가 없는 곳까지 스캔을 하여 더이상 없을 경우 그 단계의 scanDir은 파일의 Path만 fileLst에 담는 형태로 프로그램을 종료하게 된다.

 

코드 실행결과

c:\cleardir\a\img1.jpg
c:\cleardir\a\img2.jpg
c:\cleardir\a\img3.MOV
c:\cleardir\a\sub\img1.jpg
c:\cleardir\a\sub\img2.jpg
c:\cleardir\a\sub\img3.MOV
c:\cleardir\b\img1.jpg
c:\cleardir\b\img2.jpg
c:\cleardir\b\img3.MOV
c:\cleardir\img1.jpg
c:\cleardir\img2.jpg
c:\cleardir\img3.MOV

 

필자의 코드를 실행한 결과 위와 같이 정상적으로 재귀함수가 작동되었고, 파일의 내용만 리스트에 저장되어 호출된 것을 알 수 있다. 위 코드에서 만약에 파일을 삭제하고 싶으면 아래와 같은 기능을 추가하면 된다.

 

 

 

재귀함수로 파일을 삭제하는 코드

public static void main(String[] args) {
	List<String> fileLst = new ArrayList<String> ();
		
	scanDir("c:/cleardir", fileLst);
		
	for(String fullPath : fileLst) {
		File file = new File(fullPath);
		System.out.println(file.getAbsolutePath() + "=>" + file.exists());
	}
		
	System.out.println("=================== 파일 삭제 실행 =======================");
		
	for(String fullPath : fileLst) {
		File deleteFile = new File(fullPath);
		deleteFile.delete();			
	}
		
	System.out.println("=================== 파일 삭제 완료 =======================");
		
	for(String fullPath : fileLst) {
		File file = new File(fullPath);
		System.out.println(file.getAbsolutePath() + "=>" + file.exists());
	}
}	

 

실행결과

c:\cleardir\a\img1.jpg=>true
c:\cleardir\a\img2.jpg=>true
c:\cleardir\a\img3.MOV=>true
c:\cleardir\a\sub\img1.jpg=>true
c:\cleardir\a\sub\img2.jpg=>true
c:\cleardir\a\sub\img3.MOV=>true
c:\cleardir\b\img1.jpg=>true
c:\cleardir\b\img2.jpg=>true
c:\cleardir\b\img3.MOV=>true
c:\cleardir\img1.jpg=>true
c:\cleardir\img2.jpg=>true
c:\cleardir\img3.MOV=>true
=================== 파일 삭제 실행 =======================
=================== 파일 삭제 완료 =======================
c:\cleardir\a\img1.jpg=>false
c:\cleardir\a\img2.jpg=>false
c:\cleardir\a\img3.MOV=>false
c:\cleardir\a\sub\img1.jpg=>false
c:\cleardir\a\sub\img2.jpg=>false
c:\cleardir\a\sub\img3.MOV=>false
c:\cleardir\b\img1.jpg=>false
c:\cleardir\b\img2.jpg=>false
c:\cleardir\b\img3.MOV=>false
c:\cleardir\img1.jpg=>false
c:\cleardir\img2.jpg=>false
c:\cleardir\img3.MOV=>false

 

파일을 삭제한 이전에는 파일이 존재한다는 true값을 리턴하였으나, 파일을 삭제 한 후 다시 파일을 호출 할 경우 false가 뜨면서 정상적으로 파일이 삭제 된 것을 알 수 있다.

 

반응형