재귀함수(Recursive funtion)을 이용한 특정 폴더 아래의 모든 파일정보 읽어서 출력하기


왠지 도움이 될것 같다면 추천을 *(-_-)*


이런건 학교 뎅길때 숙제로 많이 하던것이다.

복잡해 보이는 문제도 이빠이 작은 부분으로 쪼개서 생각하고 고걸 recursive funtion 화 시키면 쉽게! 심플하게! 문제를 해결할 수 있다.



요 문제의 경우, 작게 쪼개서 생각할만한 부분은

어떤 디렉토리가 있으면 그 디렉토리 안에 있는 디렉토리들과 파일들을 출력할래염!!! 이다.

디렉토리의 디렉토리 안에 있는 또 다른디렉토리와 또 그 많은 파일을의 출력에 대해서는 생각하지 않는다.

어떤 디렉토리가 있으면 그 디렉토리 안에 있는 디렉토리들과 파일들을 출력할래염!!!에 대해서 recursive function 을 맹글면 된다.



어렴풋이 생각나는 학창시절의 배움을 더듬어 보면 그냥 쌩으로 for 문을 써서 하는게 속도면에서는 훨씬 빠르다.(그런데 코드는 훨씬 복잡해질것이다.)

하지만 요즘 컴퓨터는 그때의 컴퓨터가 아니다. 나는 컴퓨터를 믿는다. *(-_-)*



성능이 매우매우매우매우매우 중요할 때에는 recursive function 을 쓰면 안되겠지만 그럴 경우가 아니면야 가독성 있는 코딩을 할 수 있는 방법이 훨씬 좋다고 생각한다.




잡소리는 고만하고, source!
package com.tistory.stove99;

import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FileListExporter {
	private StringBuffer sb = new StringBuffer();
	private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

	String targetDir; // 리스팅할 대상 디렉토리
	File outputFile;  // 결과를 출력할 파일

	public FileListExporter(String targetDir, File outputFile) {
		this.targetDir = targetDir;
		this.outputFile = outputFile;
	}

	public void export() {
		// StringBuffer 로 파일정보 싹 읽어 들이기
		traversDir(new File(targetDir), 0);

		// 파일로 출력
		PrintWriter pw = null;
		try {
			pw = new PrintWriter(outputFile);
			pw.append(sb);
			pw.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (pw != null)
				pw.close();
		}
	}

	// recursive funtion
	private void traversDir(File dir, final int level) {
		dir.listFiles(new FileFilter() {

			public boolean accept(File file) {
				String modified = sdf.format(new Date(file.lastModified()));

				// 탭처리 해서 트리처럼 보이게 하기
				for (int idx = 0; idx < level; idx++) sb.append("\t");

				if (file.isDirectory()) {
					sb.append(String.format("%-35s <dir> %s", file.getName(), modified))
						.append("\r\n");
					traversDir(file, level + 1);
				} else {
					sb.append(String.format("%-35s %d %s", file.getName(), file.length(), modified))
						.append("\r\n");
				}

				return false;
			}

		});
	}

	// test
	public static void main(String[] args) {
		new FileListExporter("C:\\Program Files", new File("c:\\list.txt")).export();
		System.out.println("export end");
	}
}


파일 출력하는것 때문에 코드가 약간 길어지긴 했는데 딱 보면 코드가 그렇게 길지도 않다. 요런 짧으면서도 이해가 뽓 잘되는 코드를 맹글수 있다는게 recursive funtion의 매력인것 같다 *(-_-)*

요걸 뽓 실행해 보면 C 드라이브에 요런 list.txt 파일이 생성된다.