[Java] 자바로 지정한 폴더 및 하위 폴더 탐색(재귀적 함수)
- Language/Java
- 2020. 11. 29.
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가 뜨면서 정상적으로 파일이 삭제 된 것을 알 수 있다.
반응형
'Language > Java' 카테고리의 다른 글
[Java] 날짜값 쉽게 변경하기(GregorianCalendar) (0) | 2020.12.10 |
---|---|
[Java] 자바 랜덤함수(Random) 및 Seed 설명 (0) | 2020.12.08 |
[Java] 자바로 로또 번호 생성하기 (0) | 2020.11.26 |
[Java] 자바 날짜 포맷 변경법(SimpleDateFormat) (0) | 2020.11.26 |
[Java] 문자열 인코딩/디코딩 하기 (0) | 2020.11.17 |