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

    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가 뜨면서 정상적으로 파일이 삭제 된 것을 알 수 있다.

     

    반응형

    댓글

    Designed by JB FACTORY