0

静的クラスにパブリックプロパティがあり、不正なファイル名とパス名に対してユーザーの入力を検証する手段として使用したいと思います。

現在私はこれを持っています:

private static string invalidFileNames = new string(Path.GetInvalidFileNameChars());

private static string invalidPathNames = new string(Path.GetInvalidPathChars());

private static string invalidUserInput = (invalidFileNames + invalidPathNames); 

public static string InvalidUserInput
{

    get { return invalidUserInput; }

}

ここにあるMicrosoftのドキュメントに基づいて、私は戻ってくることを期待しています"<>|"<>|が、私が得ているのは最初のものだけ"<>|です。

ここで何が起こっているのかについて誰かが光を当てることができますか?両方の文字列が返されるようにするにはどうすればよいですか?

4

4 に答える 4

1

この場合、おそらくデータを何度も使用することになるため、両方の文字配列間で一意の文字のみを記録する必要があります。これを行うには、次のようにUnionメソッドを使用できます。

private static string invalidUserInput = new string(Path.GetInvalidFileNameChars().Union(Path.GetInvalidPathChars()).ToArray()); 
于 2013-01-06T21:13:00.750 に答える
1

デバッガーでは表示できませんが、ファイルに出力して、notepad++ などのメモ帳よりも優れたエディターで表示できます。

File.WriteAllText("tmp.txt", invalidUserInput, UTF8Encoding.GetEncoding("UTF-8"));

メモ帳++のスクリーンショット

于 2013-01-06T20:49:40.800 に答える
1

あなたはそれを単一の文字列にすることができます

using System.Linq;

public static string InvalidUserInput
{
    get 
    {
        return new string(Path.GetInvalidFileNameChars()
                  .Concat(Path.GetInvalidPathChars())
                  .Distinct()
                  .ToArray());
    }
}

InvalidUserInputあなたのケースではターミネータ型の文字\0が表示を停止する(nullテミネータ)であるため、それらすべてがTextBoxに表示されることはありません。

ユーザーにとって意味のあるものだけを表示したい場合は、次を使用して問題の原因となっているものを取り除くことができますChar.IsControl

すべてをまとめる静的クラスを次に示します。

public static class StringExtentions
{
    private static string _invalidUserInput = string.Empty;
    private static string _PrinatbleInvalidUserInput = string.Empty;

    public static string InvalidUserInput
    {
        get
        {
            if (_invalidUserInput == string.Empty)
            {
                _invalidUserInput = new string(Path.GetInvalidFileNameChars()
                      .Concat(Path.GetInvalidPathChars())
                      .Distinct()
                      .ToArray());
            }
            return _invalidUserInput;
        }
    }

    public static string GetPrinatbleInvalidUserInput
    {
        get
        {
            if (_PrinatbleInvalidUserInput == string.Empty)
            {
                _PrinatbleInvalidUserInput = new string(InvalidUserInput.Where(x => !char.IsControl(x)).ToArray());
            }
            return _PrinatbleInvalidUserInput;
        }
    }

    public static bool IsValidUserInput(this string str)
    {
        return !str.Any(c => InvalidUserInput.Contains(c));
    }
}

利用方法:

public MainWindow()
{
    InitializeComponent();
    string myString = "C:\\InvalidPath<";

    if (!myString.IsValidUserInput())
    {
        MessageBox.Show(string.Format("String cannot contain {0}", StringExtentions.GetPrinatbleInvalidUserInput));
    }
}
于 2013-01-06T20:50:10.647 に答える
0

コードを実行すると、多くの Unicode 文字が返されます。

"<>|□□□□□□□□□  
□□
□□□□□□□□□□□□□□□□□□:*?\/"<>|□□□□□□□□□  
□□
□□□□□□□□□□□□□□□□□□

Unicode 文字が原因で何も失われていないと確信していますか?

また、それはあなたの正確なコードですか?変数の初期化の順序を切り替えるとinvalidUserInput、他の 2 つの後に評価する必要があるため、機能しなくなります (コードで定義されている順序で評価されます)。

于 2013-01-06T20:49:10.457 に答える