이번에도 groovy.
간단한 작업 위해 만든 스크립트인데 나중에 써먹을 만한게 몇가지 있어서 적어봅니다.
작업 개요 : 특정 폴더 하위에 있는 모든 폴더의 자바 파일의 인코딩을 MS949 에서 UTF-8 로 전환
간단하니 일단 소스 부터.
import groovy.io.FileType
import groovy.util.CharsetToolkit
folder = “E:\\encoding_test\\data”
result = “E:\\encoding_test\\result”
new File(folder).eachDirRecurse { // (1)
subDir = it.path.replace(folder, “”)
new File(“${result}\\${subDir}”).mkdirs() // (2)
}
new File(folder).traverse(type:FileType.FILES, nameFilter:~/.*\.java/) {
charSet = new CharsetToolkit(it).getCharset(); // (3)
target = result + it.path.replace(folder, “”)
if(charSet.toString() != “UTF-8″) {
new FileOutputStream(target).withWriter(‘UTF-8′) { writer -> // (4)
new FileInputStream(it).withReader(‘MS949′) { reader ->
writer << reader
}
}
}
else {
new AntBuilder().copy (file : it , tofile : target) // (5)
}
}
(1)의 eachDirRecurse() 는 recursive 하게 디렉토리 정보를 구하는 메서드입니다.
( 제 컴 환경에서는 그냥 eachDir() 만으로도 되던데 딴 분 컴에서는 제일 상위의 서브 디렉토리만 찾는 문제가 있더군요. OS 차이 때문일까요? )
(2)에서는 mkdirs() 를 이용해서 결과 파일 저장할 디렉토리 하위에 작업 대상 디렉토리 구조와 동일하게 서브 디렉토리를 만들어 주었습니다.
(3)이 이번 작업하면서 알게된 꽤 유용한 groovy 에서 지원되는 기능인데 … groovy.util.CharsetToolkit 라는 캐릭터셋 처리 위한 패키지가 있더군요.
CharsetToolkit 에서 제공되는 getCharset()이란 메서드를 이용해서 파일의 캐릭터셋을 쉽게 알아낼 수 있습니다.
이걸 쓴 이유는 작업하려는 파일들에 MS949, UTF-8 파일이 섞여 있어서 무조건 인코딩을 바꿔주면 원래 UTF-8 형식이었던 파일은 한글이 깨지는 문제가 발생하더군요.
그래서 처리 전 파일의 캐릭터셋을 미리 확인해서 UTF-8인 경우에는 그냥 인코딩 변환 없이 결과 디렉토리로 복사만 해주었습니다.
(4) 이하 몇 줄은 ‘MS949′ 형식 파일을 UTF-8로 변환해주는거구요.
(5)번은 파일 복사하는 부분입니다.
자바와 마찬가지로 File 클래스에 보면 renameTo() 라는 메서드가 있어서 rename 이나 move 등의 용도로 쓸 수 있습니다. (renameTo 쓰는 예는 지난 번 글에 있으니 참고하세요)
하지만 copy 를 위한 메서드는 따로 있지 않으므로 직접 구현해야 하는데 대신 AntBuilder의 copy 기능을 이용하면 쉽게 처리할 수 있습니다.
( AntBuilder는 별도로 import 처리할 필요도 없습니다 )
이게 전부입니다. 딴거야 자바로 처리해도 크게 아쉬운거 없지만 groovy.util.CharsetToolkit 은 알아두면 꽤 유용하게 쓸 수 있을 듯 싶네요.
Advertisement
Like this:
Be the first to like this post.