如何扩展Path.GetInvalidFileNameChars
以包含我自己的应用程序中非法的字符集?
string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
如果我想添加'&'作为一个非法角色,我可以这样做吗?
答案 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);