我已经做过研究,但是我的应用程序偶尔会一次下载mp3文件,但我得到的文件名很奇怪,在尝试将它们刻录到CD之前不会受到伤害。下面是一个很好的例子。 动物-旭日之屋(1964)+剪辑编辑♫♥50年-counting.mp3 我有一些代码尝试捕获非法字符,但它不会停止此文件名。有没有更好的方法来捕获我当前使用的奇怪代码:
public static string RemoveIllegalFileNameChars(string input, string replacement = "")
{
if (input.Contains("?"))
{
input = input.Replace('?', char.Parse(" "));
}
if (input.Contains("&"))
{
input = input.Replace('&', char.Parse("-"));
}
var regexSearch = new string(Path.GetInvalidFileNameChars()) +
new string(Path.GetInvalidPathChars());
var r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
return r.Replace(input, replacement);
}
答案 0 :(得分:4)
CD文件系统与OS文件系统不同,因此那些Path.GetInvalidX函数实际上并不适用于CD。
我不确定,但是您正在查看的标准可能是ISO 9660 https://en.wikipedia.org/wiki/ISO_9660 该文件名中的字符集极为有限。
我认为Joliet对该标准的扩展必须发挥作用: https://en.wikipedia.org/wiki/Joliet_(file_system) 我认为,也许您遇到的文件名长度问题比什么都重要:“规范仅允许文件名的长度最大为64个Unicode字符”。您的文件名长度为90个字符。
答案 1 :(得分:2)
以下代码会将非ASCII字符转换为“?”
string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s))
然后,您可以使用sOut.Replace('?', '')
通话将其取出。看来这对您有用吗?
答案 2 :(得分:1)
尽管在这种情况下,您的文件名是有效的,但要捕获无效的文件名,建议使用GetInvalidFileNameChars()方法。
string fileName = "The Animals - House of the Rising Sun ? (1964) + clip compilation ♫♥ 50 YEARS - counting.mp3";
byte[] bytes = Encoding.ASCII.GetBytes(fileName);
char[] characters = Encoding.ASCII.GetChars(bytes);
string name = new string(characters);
StringBuilder fileN = new StringBuilder(name);
foreach (char c in Path.GetInvalidFileNameChars())
{
fileN.Replace(c, '_');
}
string validFileName = fileN.ToString();
答案 3 :(得分:0)
感谢您的帮助,最终的工作代码如下
public static string RemoveIllegalFileNameChars(string input, string replacement = "")
{
if (input.Contains("?"))
{
input = input.Replace('?', char.Parse(" "));
}
if (input.Contains("&"))
{
input = input.Replace('&', char.Parse("-"));
}
var regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
var r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
// check for non asccii characters
byte[] bytes = Encoding.ASCII.GetBytes(input);
char[] chars = Encoding.ASCII.GetChars(bytes);
string line = new String(chars);
line = line.Replace("?", "");
//MessageBox.Show(line);
return r.Replace(line, replacement);
}