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); } } }