在C#中将我自己的非法字符插入Path.GetInvalidFileNameChars()

时间:2010-12-30 14:14:37

标签: c# .net extension-methods

如何扩展Path.GetInvalidFileNameChars以包含我自己的应用程序中非法的字符集?

string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());

如果我想添加'&'作为一个非法角色,我可以这样做吗?

5 个答案:

答案 0 :(得分:15)

typeof(Path).GetField("InvalidFileNameChars", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, new[] { 'o', 'v', 'e', 'r', '9', '0', '0', '0' });

答案 1 :(得分:3)

试试这个:

var invalid = Path.GetInvalidFileNameChars().Concat(new [] { '&' });

这将产生IEnumerable<char>包含所有无效字符,包括您的字符。

以下是一个完整的例子:

using System.IO;
using System.Linq;

class Program
{
    static void Main()
    {
        // This is the sequence of characters
        var invalid = Path.GetInvalidFileNameChars().Concat(new[] { '&' });
        // If you want them as an array you can do this
        var invalid2 = invalid.ToArray();
        // If you want them as a string you can do this
        var invalid3 = new string(invalid.ToArray());
    }
}

答案 2 :(得分:2)

您无法修改现有函数,但您可以编写一个包装函数,该函数返回Path.GetInvalidFileNameChars() 您的非法字符。

public static string GetInvalidFileNameChars() {
    return Path.GetInvalidFileNameChars().Concat(MY_INVALID_FILENAME_CHARS);
}

答案 3 :(得分:1)

扩展方法是您最好的选择。

public static class Extensions
{
    public static char[] GetApplicationInvalidChars(this char[] input)
    {
        //Your list of invalid characters goes below.
        var invalidChars = new [] { '%', '#', 't' };
        return String.Concat(input, invalidChars).ToCharArray();
    }
}

然后按如下方式使用:

string invalid = Path.GetInvalidFileNameChars().GetApplicationInvalidChars();

它会将您的无效字符连接到已存在的字符。

答案 4 :(得分:0)

首先创建一个助手类“ SanitizeFileName.cs”

public class SanitizeFileName
{
   public static string ReplaceInvalidFileNameChars(string fileName, char? replacement = null)
   {
      if (fileName != null && fileName.Length != 0)
      {
         var sb = new StringBuilder();
         var badChars = new[] { ',', ' ', '^', '°' };
         var inValidChars = Path.GetInvalidFileNameChars().Concat(badChars).ToList();

         foreach (var @char in fileName)
         {
            if (inValidChars.Contains(@char))
            {
               if (replacement.HasValue)
               {
                  sb.Append(replacement.Value);
               }
               continue;
            }
            sb.Append(@char);
         }
         return sb.ToString();
      }
      return null;
   }
}

然后,像这样使用它:

var validFileName = SanitizeFileName.ReplaceInvalidFileNameChars(filename, '_');

就我而言,我必须使用c#下载方法清理响应标题中“内容沉积”上的“文件名”。

Response.AddHeader("Content-Disposition", "attachment;filename=" + validFileName);