我通过EF3.5从SQL服务器数据库的nvarchar字段获取数据。此字符串用于创建文件名,需要删除无效字符并尝试以下选项,但它们都不起作用。请提出为什么这是一个可以理解的谜团?我做错了吗?
我浏览了本网站上的几乎所有相关问题..现在发布了来自其他类似问题的所有建议/答案的综合问题。
UPD:问题无关......所有这些选项都有效。所以将其发布到社区维基。
public static string CleanFileName1(string filename)
{
string file = filename;
file = string.Concat(file.Split(System.IO.Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries));
if (file.Length > 250)
{
file = file.Substring(0, 250);
}
return file;
}
public static string CleanFileName2(string filename)
{
var builder = new StringBuilder();
var invalid = System.IO.Path.GetInvalidFileNameChars();
foreach (var cur in filename)
{
if (!invalid.Contains(cur))
{
builder.Append(cur);
}
}
return builder.ToString();
}
public static string CleanFileName3(string filename)
{
string regexSearch = string.Format("{0}{1}",
new string(System.IO.Path.GetInvalidFileNameChars()),
new string(System.IO.Path.GetInvalidPathChars()));
Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
string file = r.Replace(filename, "");
return file;
}
public static string CleanFileName4(string filename)
{
return new String(filename.Except(System.IO.Path.GetInvalidFileNameChars()).ToArray());
}
public static string CleanFileName5(string filename)
{
string file = filename;
foreach (char c in System.IO.Path.GetInvalidFileNameChars())
{
file = file.Replace(c, '_');
}
return file;
}
答案 0 :(得分:27)
这是我在静态公共类中使用的函数:
public static string RemoveInvalidFilePathCharacters(string filename, string replaceChar)
{
string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
return r.Replace(filename, replaceChar);
}
答案 1 :(得分:4)
试试这个
filename = Regex.Replace(filename, "[\/?:*""><|]+", "", RegexOptions.Compiled)
答案 2 :(得分:3)
没有被删除的System.IO.Path.GetInvalidFileNameChars()返回的无效字符。 - Bhuvan 5分钟前
您发布的第一种方法适用于Path.GetInvalidFileNameChars()
中的字符,此处处于工作状态:
static void Main(string[] args)
{
string input = "abc<def>ghi\\1234/5678|?9:*0";
string output = CleanFileName1(input);
Console.WriteLine(output); // this prints: abcdefghi1234567890
Console.Read();
}
我想虽然您的问题是某些特定于语言的特殊字符。您可以尝试通过打印字符串中字符的ASCII代码来解决此问题:
string stringFromDatabase = "/5678|?9:*0"; // here you get it from the database
foreach (char c in stringFromDatabase.ToCharArray())
Console.WriteLine((int)c);
并咨询ASCII表:http://www.asciitable.com/
我再次怀疑你会看到代码大于128的字符,你应该从字符串中排除这些字符。