C# で Windows 上で使用できるファイル名かどうかをチェックする実装です。
using System.IO; using System.Text.RegularExpressions; public class WindowsFileSystem { // 使用禁止文字 static readonly char[] invalidChars = Path.GetInvalidFileNameChars(); // 指定したファイルパスが使用できるかどうか? // true: 使える / false: 使えない public bool CanUseFilePath(string path) { if (string.IsNullOrWhiteSpace(path)) return false; // 推定ファイル名の部分を取得する int index = path.LastIndexOf('\\'); string word = index == -1 ? path : path.Substring(index + 1, path.Length - index - 1); return CanUseFileName(word); } // 指定した文字列がファイル名 or フォルダ名に使用できるかどうか? // true: 使える / false: 使えない public bool CanUseFileName(string name) { if (string.IsNullOrWhiteSpace(name)) return false; // 拡張子より前を選択 int index = name.IndexOf('.'); string target = index == -1 ? name : name.Substring(0, index); // 対象に不正な文字が含まれているか? foreach (char c in target) { foreach (var p in invalidChars) { if (c == p) return false; } } // 予約語が含まれていないか? return !Regex.IsMatch(target, @"^((COM|LPT)[1-9]|CON|PRN|AUX|NUL)$", RegexOptions.IgnoreCase); } }
長さについてはチェックしていません。
このクラスの使い方は以下の通りです。
private static void Main(string[] args) { WindowsFileSystem windows = new(); bool isOK = windows.CanUseFilePath(@"d:\hoge\sample.txt"); if (isOK) { // 使える } else { // 使えない } }