ファイル名禁止文字除去が業務で重要になる理由
業務システムでは、ユーザーがアップロードしたファイルを保存したり、レポートやエクスポート結果をファイルとして出力したりする場面が非常に多くあります。そのときに、ユーザーが入力したファイル名や外部システムから渡されたファイル名をそのまま使ってしまうと、OSごとの禁止文字やパスの混入によって、保存に失敗したり、最悪の場合セキュリティ上の問題につながることがあります。そこで「ファイル名禁止文字除去ユーティリティ」を用意しておくことで、どの機能からも同じルールで安全なファイル名に変換できるようになり、システム全体の安定性と安全性が高まります。
ファイル名禁止文字除去は、単に「変な文字を消す」だけではなく、「どのOSを想定するか」「どこまでを禁止とみなすか」「置き換えるのか削除するのか」といった方針を決めることが大切です。ここでは、プログラミング初心者の方にも分かりやすいように、ステップバイステップで考えながら、実務で使えるユーティリティの形に落とし込んでいきます。
ステップ1 禁止文字とは何かを理解する
ファイル名禁止文字除去を考えるとき、まず「何が禁止文字なのか」をざっくり押さえておく必要があります。代表的な例として、Windows では \ / : * ? " < > | がファイル名に使えません。UNIX 系では / がパス区切りとして使われるため、ファイル名に含めるべきではありません。また、制御文字やタブ、改行などもファイル名としては不適切です。
ここで重要なのは、「OSごとに禁止文字が違うが、共通して危険な文字はある」という感覚です。実務では、完全にOSごとに分けて実装するよりも、「どのOSでも安全な文字だけを許可する」方針にしておくと扱いやすくなります。そのうえで、明らかに危険な文字(パス区切りや制御文字など)を除去するユーティリティを作っていきます。
ステップ2 禁止文字の一覧と方針を決める
次に、「どの文字を禁止するか」をコードに落とし込むための方針を決めます。初心者の方には、「禁止文字を全部列挙する」よりも、「許可する文字を決めて、それ以外は置き換える・削除する」という考え方の方が分かりやすいことが多いです。ただし、ここでは「禁止文字除去」というテーマなので、代表的な禁止文字を明示的に扱う形で説明します。
例えば、次のような方針を取ることができます。Windows の禁止文字である \ / : * ? " < > | を禁止文字として扱う。UNIX 系でパス区切りとなる / も禁止文字として扱う。制御文字(ASCIIコードの0〜31)やタブ、改行なども禁止文字として扱う。これらの禁止文字がファイル名に含まれていた場合、削除するか、アンダースコア _ に置き換えるかを決めておきます。
このように「禁止文字の一覧」と「禁止文字を見つけたときの処理方針」を決めておくことで、ユーティリティの実装が明確になります。
ステップ3 基本的な禁止文字除去ユーティリティを書く
ここから、実際のコードとして「ファイル名から禁止文字を取り除く」ユーティリティを作っていきます。まずは、禁止文字を削除するシンプルなバージョンから始めます。
public class FilenameForbiddenRemover {
// Windows で禁止されている代表的な文字
private static final String FORBIDDEN = "\\/:*?\"<>|";
public static String removeForbidden(String original) {
if (original == null || original.isEmpty()) {
return "unnamed";
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < original.length(); i++) {
char c = original.charAt(i);
// 制御文字は除外
if (c < 32) {
continue;
}
// 禁止文字一覧に含まれている場合は除外
if (FORBIDDEN.indexOf(c) >= 0) {
continue;
}
// パス区切りとして使われるスラッシュも除外
if (c == '/') {
continue;
}
sb.append(c);
}
String sanitized = sb.toString();
if (sanitized.isEmpty()) {
sanitized = "unnamed";
}
return sanitized;
}
}
Javaこのコードでは、元のファイル名を1文字ずつ見ていき、禁止文字一覧に含まれている文字や制御文字、スラッシュ / をスキップしています。残りの文字だけを StringBuilder に追加していくことで、「禁止文字を除去したファイル名」を作っています。最後に、すべての文字が禁止文字で削除されてしまった場合に備えて、空文字になったときは "unnamed" というフォールバック名を返すようにしています。
使い方の例としては、次のようになります。
public class FilenameForbiddenRemoverExample {
public static void main(String[] args) {
String original = "危険なファイル名?.txt";
String safe = FilenameForbiddenRemover.removeForbidden(original);
System.out.println("元のファイル名: " + original);
System.out.println("禁止文字除去後: " + safe);
}
}
Javaこのようにしておくと、ユーザーがどんな文字を含んだファイル名を指定してきても、禁止文字だけを取り除いた形で保存できるようになります。
