!!!技術的雑談-Javaでファイル名として使えない文字 !!環境 *Java : 1.6.0u03 (jdk.1.6.0_03) *OS: RedHat Linux 5.0とWindowsXPsp2(NTFS)で検証 !!調査内容 Java内でjava.io.File()を使ってファイルを作成/削除するときに問題となる文字を調べてみた。 !!テストプログラム import java.io.File; import java.io.IOException; public class Test { public static void main(String[] args) { System.out.println("******** START ********"); File tmp = new File(System.getProperty("user.dir"), "/tmp"); tmp.mkdir(); String head = ""; String tail = ""; for (int x = 0; x < 4; ++x) { if (x == 1) { head = "x"; } if (x == 2) { head = ""; tail = "a"; } if (x == 3) { head = "x"; tail = "a"; } for (char i = ' ' ; i <= '~'; ++ i) { if (!tmp.isDirectory()) { tmp.delete(); tmp.mkdir(); } String a = head + new String(new char[]{i}) + tail; if (i == 92) { a = head + "\\" + tail; } File file = new File(tmp, a); System.out.print("Testing [" + a + "] : " + file.toString() + " "); if (file.exists()) { boolean deleted = file.delete(); if (!deleted) { System.out.println("file [" + a + "] is already present and could not delete ! "); continue; } } boolean created = false; try { created = file.createNewFile(); if (created) { System.out.println(" OK"); } else { System.out.println(" NG !!"); } } catch (IOException e) { System.out.println(" FAILED !! " + e.getMessage()); } } System.out.println(); } System.out.println("******** END ********\n"); } } ''#途中の「\」の操作とかはいらない気もするが…(内緒) !!結果 !Linux(RedHad5.1) *だめな文字:「/」(ディレクトリ区切りだから) *だめなファイル名:「.」(カレントディレクトリの特殊ファイル名)、「..」(親ディレクトリの特殊ファイル名) !WindowsXP(NTFS) *だめな文字:「\/:*?<>|"」(Explorerで名前変換中に入力するとバルーンヘルプが出る) *先頭の「 」(半角スペース。無視される。スペースの後に文字が続けばエラーにはならない。) *Explorerから「.」だけ(入力できない) *Explorerから「..」だけ(入力できない) !Java的にダメっぽい文字 *ファイル名最後の「\」(「\\」にしてもなくなってしまう。但し、bashから「touch 'a\'」を実行すると「a\」というファイルは作られる。) !!所感 意外とLinuxって優秀。(なにを?) Windows上でJavaのデバッグをやっていると、サーバ(Linux)に移した時に動かなくなることはなさそうだけど、余計な制約がつきそうですね。 Webから入力された文字列をファイル名に含める場合などの時は思わぬエラーが出ることもありそうなので、サニタイズを忘れずに。 !!履歴 2007/12/14 -- 初版 [[技術的雑談]]へ戻る !!突っ込み {{comment}} [[技術的雑談]]へ戻る {{trackback}} [[技術的雑談]]へ戻る