ファイル名に使えない文字

C# 備忘ログ。

テキストボックスに入力したワードをそのまま ディレクトリの作成やファイル作成とかのメソッドに渡すと、例外が飛んでくることがある。ほとんどの場合、?,:,/ などの文字をエスケープしてない!のが原因。めんどくさいのう! と思いながら、それらの文字をフィルタリングするメソッドを書いてたんですが・・・結構気の利くメソッドを見つけた。

Path.GetInvalidFileNameChars()とPath.GetInvalidPathChars()メソッド。

単純にコールすると、ファイルシステム上で使えない文字をchar[]配列に格納して返してくれる! ・・・が、ドキュメントを見ると、頼りないお言葉が・・・

このメソッドから返される配列は、ファイルおよびディレクトリの名前に無効な文字の完全なセットが含まれているとは限りません。

おいおい!仕事放棄するなよぅっっっッ!
ってなわけで、結局、”CON”やら”PRN”とかは自前でフィルタリングしないといけない・・・と。

//using System;
//using System.Text.RegularExpressions;
//using System.IO;
//using System.Linq;
//...
/// <summary>
/// ファイルシステムで使用できない文字をエスケープする。
/// CON,PRNなどの文字列の場合は、before,afterを前後に付けて返す。
/// 制御文字などの文字は、16進文字コードに変換する。
/// </summary>
/// <param name="str">検査する文字</param>
/// <returns>エスケープされた文字列</returns>
public static string EscapeInvalidPathChars(string str,string before="x",string after = "x")
  {
    string rv = Regex.Replace(str,
                              string.Format(@"([{0}])",Regex.Escape(new String(Path.GetInvalidFileNameChars()))),
                              m => Uri.HexEscape(m.Value.First()));

    if(Regex.Match(rv,@"^(CON|PRN|AUX|NULL|COM\d|LPT\d)$",RegexOptions.IgnoreCase).Success)
      rv = string.Format("{1}{0}{2}",rv,before,after);

    return rv;
  }

そういえば・・・CONCON問題とかあったのう。。。ブルースクリーンで一喜一憂してた時代でほのぼのしてたなー