자바 폴더내에 파일리스트 뽑는 로직좀 짜주세요

Question:

자바로 특정 디렉토리를 지정하면,

예를 들어 C:\test\ 까지를 지정하면 test 밑에 폴더가 있더래도 하위폴더까지 모든 파일의

파일명+확장자, 파일사이즈, 최종수정일 등을 텍스트 파일로 저장하고싶은데

자바 초보라서 시작도 어찌해야될지 모르겠어요….

도와주세요 고수님들…ㅠㅠ

Answer:

File.listFiles() 를 이용하면 해당 디렉토리에 있는 모든 파일 정보를 받아 올 수 있습니다.
그렇지만 이것은 1레벨의 파일만을 리턴하기 때문에 하위 폴더 정보를 확인을 할 수 없습니다.
그래서 재귀적 호출을 사용하여 맨 하위 폴더가 있을때가지 메모리에 저장하면서
탐색을 합니다.
탐색한 파일을 리스트에 저장하고 저장된 리스트를 파일에 출력하도록 작성 했습니다.
주의 사항은 재귀적 호출이기 때문에 너무 많은 파일을 탐색하는 경우에는 OutOfMemory 가
발생 될 수 있습니다.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 * 폴더내에 파일리스트 뽑는 로직
 * @author Coozplz
 */


public class FileSearcher {

    public static void main(String[] args) throws FileNotFoundException, IOException {

        // 파일 최종 수정일 날짜 형식
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 읽어올 경로
        File dir = new File("c:/temp");
        if(dir.exists() == false ) {
            System.out.println("경로가 존재 하지 않습니다.");
            return ;
        }
        // 출력할 파일 경로
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c:/result.txt")));

        // 탐색할 파일을 저장할 리스트
        ArrayList files = new ArrayList();

        // 파일을 탐색한다.
        visitAllFiles(files, dir);

        // 탐색한 파일을 하나씩 출력할 파일에 쓴다.
        for(File f : files) {
            String line = f.getName() +"/"+f.getName().substring(f.getName().lastIndexOf(".") > 0 
                             ? f.getName().lastIndexOf(".")+1 : f.getName().length())
                    +"/"+f.length()
                    +"/"+sdf.format(new Date(f.lastModified())) +"\n";
            bw.write(line);
        }
        bw.flush();
        bw.close();
    }


    /**
     * 총 파일 수를 arraylist에 추가 합니다.
     * 만약 검색된 부분이 디렉토리라면 하위 폴더를 탐색합니다.
     */
    public static void visitAllFiles(ArrayList files, File dir) {

        if(dir.isDirectory()) {
            File[] children = dir.listFiles();
            for(File f : children) {
                // 재귀 호출 사용
                // 하위 폴더 탐색 부분
                visitAllFiles(files,f);
            }
        } else {
            files.add(dir);
        }
    }
}