web-dev-qa-db-ja.com

ファイル名の検証のためのC#の正規表現

テキスト文字列を検証して、それが有効なWindowsファイル名であることを確認できる優れた正規表現とは何ですか? (AKAには\/:*?"<>|文字がありません)。

次のように使いたいです。

// Return true if string is invalid.
if (Regex.IsMatch(szFileName, "<your regex string>"))
{
    // Tell user to reformat their filename.
}
19
Game_Overture

すでに回答したように、GetInvalidFileNameCharsがそれを実行するはずであり、正規表現のオーバーヘッドも必要ありません。

if (proposedFilename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
  MessageBox.Show("The filename is invalid");
  return;
}
48
Isak Savo

これは、ファイル名に System.IO.Path.GetInvalidFileNameChars (他のいくつかの回答ですでに述べたように)が含まれているかどうかを確認するほど簡単ではありません。

たとえば、誰かが無効な文字を含まないが300文字の長さ(つまりMAX_PATHより大きい)の名前を入力した場合はどうなりますか?これはどの.NETファイルAPIでも機能せず、を使用する残りのウィンドウでのサポートが制限されます\?\パス構文。ファイル名の長さを決定するには、パスの残りの長さに関するコンテキストが必要です。あなたは見つけることができます このタイプのものについての詳細はここにあります

最終的に、すべてのチェックで確実に実行できるのは、ファイル名が無効であることを証明すること、またはファイル名が有効かどうかについて合理的な見積もりを提供することです。実際に使用しようとせずにファイル名が有効であることを証明することは事実上不可能です。 (それでも、すでに存在する場合はどうなるかなどの問題がありますか?それは有効なファイル名である可能性がありますが、シナリオで重複する名前を持つことは有効ですか?)

6
Greg Beech

Path.GetInvalidFileNameChars-良い方法ではありません。これを試して:

if(@"C:\A.txt".IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
  MessageBox.Show("The filename is invalid");
  return;
}
0

System.IO.FileInfoクラスをDirectoryInfoクラスと一緒に使用しないのは、便利なメソッドのセットがあります。

0
Drejc