[Java] ファイル名に使用不可能な文字列

4 min read

ファイル名には使用不可能な文字列がいくつかあります。
プログラムでファイルを作るときはこれらを考慮しなければいけないわけで。

ファイル名 - Wikipediaで確認すると不可能な記号の他に禁止文字列も存在するようです。

記号記号名使用が不可能な理由
/スラッシュパス名コンポーネント分離符として、UNIXなどのOSやMS-DOSWindowsでは使用不可能。
\バックスラッシュ同様にパス名コンポーネント分離符として、MS-DOSとWindowsでは使用不可能。
 ?クエスチョンマークワイルドカード(不特定だと示す記号)として使われるため、WindowsとAmigaOSでは使用不可能。
*アスタリスク同様にワイルドカードとして、MS-DOSとWindowsでは使用不可能。
 :コロンドライブレターに使用される、またはパス名分離符であるなどの理由から、Windows、AmigaOS、Mac OSでは使用不可能。
|バーティカルバーパイプの記号なので、Windowsで使用不可能。
"引用符スペースを含むファイル名の始まりと終わりを指定するのに使われるため、Windowsで使用不可能。
<小なり記号リダイレクトの記号として使われるので、UNIX系ではエスケープの必要な場合がある。NTFSでは使用不可。
>大なり記号<と同様に、UNIX系ではエスケープが必要な場合がある。NTFSでは使用不可。
.終止符ファイル名の最後に打ち込んだ場合、その後に拡張子が続くと解釈されるなどのトラブルとなってしまうため、MS-DOSで使用不可能。
CON, PRN, AUX, CLOCK$, NUL
COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9

CLOCK$とありますが、自機で試したところ上手くいきませんでした。試しにLOCK$でやってみたところ上手くいきましたので、もしかしたらこちらが正解かもしれないです。(環境差かもしれないですが)

Java配列に入れる

/**
 * 禁則文字列
 */
// 使用不可能な記号
public static final String[] PROHIBITED_SYMBOLS = {
"\", "/", ":", "*", "?", "&#039;", "&quot;", "<", ">"
};

// Windows と MS-DOS の予約デバイス名
public static final String[] PROHIBITED_CHARACTERS = {
"CON", "PRN", "AUX", "CLOCK$", "NUL",
"COM0", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9",
"LPT0", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"
};