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

您无法在调试器中看到它们,但您可以将它们输出到文件中,并使用比记事本更好的编辑器查看它们,例如 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());
    }
}

您不会在 TextBox 中看到它们,因为InvalidUserInput在您的情况下终止符类型字符\0是它停止显示的(空终止符)。

如果您只想显示对用户有意义的内容,您可以使用删除导致问题的内容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 回答
1

在这种情况下,因为您可能会多次使用数据,您可能只想记录两个字符数组之间唯一的字符。为此,您可以使用Union方法,如下所示:

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

运行您的代码会返回许多 unicode 字符:

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

你确定你没有因为 unicode 字符而丢失任何东西吗?

另外,这是您的确切代码吗?如果您切换变量初始化的顺序,它将不再起作用,因为invalidUserInput必须在其他两个之后进行评估(它们按照它们在代码中定义的顺序进行评估)。

于 2013-01-06T20:49:10.457 回答