평화로운 어느날, 꿀을 빨고 있던 나에게 특명이 떨어졌다.. 서버에 실제로 존재하는 첨부파일과 DB상에 있는 첨부파일을 비교하여 누락된 첨부파일이 없는지 확인 하라는 것이였다.. 아직 애송이 개발자인 나에게 파일처리는 멀게만 느껴지는건 어쩔수가 없나보다. 그러한 이유로 지시를 받는 순간 숨이 막히기 시작했다.. 잠시 고민하다가 어쨌든 텍스트형태로 된 파일이름의 값이 있어야지만 이를 이용하여 DB에 넣어 조인을 해서 비교를 하거나, 엑셀을 이용해 어떻게든 비교할 수 있을 태니 우선 서버상에 있는 첨부파일들의 이름을 텍스트형태로 가져와야 겠다는 생각이 들었는데 문제는 파일이름을 어떻게 가져오냐 였다.
cmd창에서 파일이름을 가져오는 방법을 알고는 있었지만 첨부파일마다 파일경로가 다르고(하위폴더에 위치) 무엇보다도 cmd창에서 파일이름을 가져와 복사하여 메모장에 붙여넣기 한다는게 개발자로서 자존심이 상했다 -_-;; 이러한 이유로 자바를 이용하여 파일이름을 가져오기로 했고 자바에서 지원하는 FileWriter를 이용하여 복붙없이 자.동.으.로 파일이름을 메모장에 Write 할려고 한다.
JAVA 코드
import java.io.File;
import java.io.FileWriter;
public class mainClass {
public static void main(String[] args) throws Exception {
fileSearch("/Users/pc/test");
}
public static void fileSearch(String path) throws Exception {
File dir = new File(path);
File[] fileList = dir.listFiles();
FileWriter writer = new FileWriter(new File("/Users/pc/test/test.txt"), true);
for(int i=0; i<fileList.length; i++) {
File file = fileList[i];
if(file.isFile()){
if(!file.getName().equals(".DS_Store")) {
System.out.println("파일 : " + file.getName());
writer.write(file.getName() + "\n");
writer.flush();
}
} else if(file.isDirectory()) {
fileSearch(file.getCanonicalPath().toString());
}
}
}
}
뭔가 장황하게 설명할려고 마음에 준비를 단단히 하고 있었는데 생각보다 일이 쉽게 끝났습니다. 파일처리에 대하여 고민하는 사람들이라면 이미 자바에서의 함수개념과 객체사용에 대해서는 익숙할 태니 위의 코드만 보면 쉽게 이해가 가능하리라 생각하며 몇가지 참고할 사항에 대하여 아래에서 추가적인 코멘트를 남겨 놓겠습니다.
FileWriter writer = new FileWriter(new File("/Users/pc/test/test.txt"), true);
writer.write("글자쓰기~");
writer.flush();
복붙 없는 자.동.화의 핵심 FileWriter입니다. 위에서 지정한 경로와 파일명으로 파일이 생성되며 write함수를 이용해 글자를 입력할 수 있습니다. 매개변수로 던진 true값은 기존값을 유지하면서 아래쪽에 이어서 write하라는 의미입니다. 만약 false로 변경할 경우 기존의 내용은 삭제하고 덮어쓰게 됩니다.
그리고 파일경로의 경우 저는 맥을 사용하고 있어서 경로가 /로 시작하지만 윈도우 컴퓨터라면 c:/ 이런식으로 경로가 시정하셔야 하는데 바로 c:/경로에 파일을 쓰면 권한이 없어서 에러가 발생하는 경우가 있습니다 따라서 c:/folder/.. 이런식으로 최소 한단계 이상은 하위폴더를 만들어 경로를 지정하셔야 합니다~
if(!file.getName().equals(".DS_Store")) {
System.out.println("파일 : " + file.getName());
writer.write(file.getName() + "\n");
writer.flush();
}
제가 사용하는 컴퓨터는 맥인데 맥에서는 폴더에 숨김파일로 .DS_Store라는 파일이 존재하여 원치 않는 파일의 이름까지 기록되어 조건문으로 제외처리를 했습니다. 그리고 파일이름 뒤의 "\n"부분은 줄바꿈 처리 입니다.
} else if(file.isDirectory()) {
fileSearch(file.getCanonicalPath().toString());
}
현재 저의 상황은 위에서 언급한 바와 같이 한개의 폴더에 모든 첨부파일이 있는 것이 아니라 폴더안에 하위폴더에 다시 하위폴더에 첨부파일이 있는 경우도 있어서 만약 탐색한 파일이 디렉토리(폴더)라면 다시 안쪽으로 들어가 fileSearch(위에서 만들어 놓은 함수)를 다시 실행하도록 처리했습니다. 이렇게 특정함수가 함수내에서 자기 자신을 다시 호출하는 것을 '재귀 함수(Recursive Function)' 라고 부릅니다.
댓글