기본적으로 OS에서는 특수 캐릭터가 예약되어 있어, 파일 이름으로 사용할 수 없다.
그래서, 프로그램에서 파일 관련 작업을 하기 전에, 파일 이름에 대한 유효성 체크와 파일 이름에 대한 변환이 필요한 경우가 있다. 위에 대한 내용은, http://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words나 http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx#naming_conventions에서 OS별로 예약되어 있는 캐릭터와 파일의 길이를 확인할 수 있다.
아래는 위의 MSDN 링크(윈도우 OS)에 나와 있는 대표적인 캐릭터이고, 추가적인 문자열은 위 링크에서 확인할 수 있다.
< (less than)
> (greater than)
: (colon)
” (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)
아래는 자바로 위의 제약조건에 대한 확인을 제공하는 클래스이다.
import java.util.regex.Pattern; public class FileNameUtil { // 파일이름 확인.. static final String ILLEGAL_EXP = "[:\\\\/%*?:|\"<>]"; /** * 파일 이름이 유효한지 확인한다. * * @author mcsong@gmail.com * @param fileName 파일의 이름, Path를 제외한 순수한 파일의 이름.. * @return */ public static boolean isValidFileName(String fileName) { if(fileName == null || fileName.trim().length() == 0) return false; return !Pattern.compile(ILLEGAL_EXP).matcher(fileName).find(); } /** * 파일 이름에 사용할 수 없는 캐릭터를 바꿔서 유효한 파일로 만든다. * * @author mcsong@gmail.com * @param fileName 파일 이름, Path를 제외한 순수한 파일의 이름.. * @param replaceStr 파일 이름에 사용할 수 없는 캐릭터의 교체 문자 * @return */ public static String makeValidFileName(String fileName, String replaceStr) { if(fileName == null || fileName.trim().length() == 0 || replaceStr == null) return String.valueOf(System.currentTimeMillis()); return fileName.replaceAll(ILLEGAL_EXP, replaceStr); } /** * @param args */ public static void main(String[] args) { String c = "!\"#$%&(){}@`*:+;-.<>,^~|'[]akdfsjhex.txt"; System.out.println("bbbb --> " + isValidFileName("abcde.jpg")); System.out.println("bbbb --> " + isValidFileName(c)); System.out.println("bbbb --> " + makeValidFileName(c, "_") ); } }
위 코드는 자바 환경인 안드로이드에서도 사용할 수 있다.
좋네요. 딱 필요해서 검색했는데, 원하는결과에요. 🙂