C# 从文件名中删除要刻录到CD上的非法字符

C# 从文件名中删除要刻录到CD上的非法字符,c#,C#,我做过研究,但我的应用程序每隔一段时间就会下载一次mp3文件,我会得到一个奇怪的文件名,直到我试着把它们刻录到CD上,这个文件名才对我有影响。下面是一个很好的例子。 《动物之家》1964+剪辑汇编♫♥ 50年-计数.mp3 我有一些代码试图捕捉非法字符,但它并没有阻止这个文件名。有没有更好的方法来捕捉我目前使用的奇怪代码: public static string RemoveIllegalFileNameChars(string input, string replacement = "")

我做过研究,但我的应用程序每隔一段时间就会下载一次mp3文件,我会得到一个奇怪的文件名,直到我试着把它们刻录到CD上,这个文件名才对我有影响。下面是一个很好的例子。 《动物之家》1964+剪辑汇编♫♥ 50年-计数.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);
    }

以下代码将非ascii字符转换为“?”

string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s))

然后您可以使用sOut.Replace“?”,调用将它们取出。这似乎对您有用吗?

以下代码将非ascii字符转换为“?”

string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s))

然后您可以使用sOut.Replace“?”,调用将它们取出。这似乎适合您吗?

CD文件系统与OS文件系统不同,因此那些Path.GetInvalidX函数实际上不适用于CD

我不确定,但可能您正在查看的标准是ISO9660 文件名中的字符集非常有限

我认为Joliet对该标准的扩展必须发挥作用:
我认为,可能您遇到的文件名长度问题比任何问题都多:该规范只允许文件名的长度最多为64个Unicode字符。您的文件名长度为90个字符。

CD文件系统与OS文件系统不同,因此那些Path.GetInvalidX函数实际上不适用于CD

我不确定,但可能您正在查看的标准是ISO9660 文件名中的字符集非常有限

我认为Joliet对该标准的扩展必须发挥作用:
我认为,可能您遇到的文件名长度问题比任何问题都多:该规范只允许文件名的长度最多为64个Unicode字符。您的文件名长度为90个字符。

虽然在本例中,您的文件名是有效的,但要捕获无效的文件名,建议使用方法


虽然在这种情况下,您的文件名是有效的,但要捕获无效的文件名,建议使用方法


感谢您的帮助,下面列出了最终的工作代码

 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);
    }

感谢您的帮助,下面列出了最终的工作代码

 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);
    }

由于您发布的名称是完全有效的,您应该弄清楚CD刻录机工具期望的是什么,并过滤掉所有内容。乍一看,您的代码没有什么问题,但看起来您的burner软件更挑剔。就您的文件系统而言,该文件名只包含合法字符,因为否则它不可能与该名称一起存在。因此,Path.GetInvalidFileNameChars在这里对您没有帮助。也许您的CD刻录软件只支持ASCII字符。谢谢我正在使用code项目的media burner顺便问一下,您是将这些文件刻录为音频光盘还是数据光盘?如果后者和该软件将原始文件名传递到CD的文件系统,那么文件系统支持的任何字符和文件名长度都将取决于您。问题似乎只是如何转换为ascii?由于您发布的名称是完全有效的,您应该弄清楚CD刻录机工具期望的是什么,并过滤掉所有内容。乍一看,您的代码没有什么问题,但看起来您的burner软件更挑剔。就您的文件系统而言,该文件名只包含合法字符,因为否则它不可能与该名称一起存在。因此,Path.GetInvalidFileNameChars在这里对您没有帮助。也许您的CD刻录软件只支持ASCII字符。谢谢我正在使用code项目的media burner顺便问一下,您是将这些文件刻录为音频光盘还是数据光盘?如果后者和该软件将原始文件名传递到CD的文件系统,那么文件系统支持的任何字符和文件名长度都将取决于您。问题似乎只是如何转换为ascii?我将您的代码添加到我的开头,并更改了其余的输入字符串,以解决问题:它不允许出现空字符串,并创建了一个错误字符串sOut=Encoding.ASCII.GetStringEncoding.ASCII.GetBytesinput;sOut.替换“?”;我做了一个Char.parse。它不起作用仍然得到以下错误System.ArgumentException:“传递给Icon的Win32句柄无效或类型错误。”我将您的代码添加到我的代码开头,并更改了其余的输入字符串以输出。问题是它不允许出现空字符串并创建错误字符串sOut=Encoding.ASCII.GetStringEncoding.ASCII.GetBytesinput;sOut.替换“?”;我做了一个Char.parse,它不起作用,仍然得到以下错误System.ArgumentEx
异常:“传递给Icon的Win32句柄无效或类型错误。”我发现了,我认为您的原始sout代码会起作用,我只是忘了调用它;这就是我最后的结果,我在上面的代码末尾添加了它//检查非asccii字符byte[]bytes=Encoding.ASCII.GetBytesinput;char[]chars=Encoding.ASCII.GetCharsbytes;字符串行=新字符串字符;行=行。替换;MessageBox.Showline;返回r.Replaceline,replacement;最后一个问题,我如何在我的评论中使用代码标签?我想我知道了,我想你原来的sout代码应该可以工作,我只是忘了调用它;这就是我最后的结果,我在上面的代码末尾添加了它//检查非asccii字符byte[]bytes=Encoding.ASCII.GetBytesinput;char[]chars=Encoding.ASCII.GetCharsbytes;字符串行=新字符串字符;行=行。替换;MessageBox.Showline;返回r.Replaceline,replacement;最后一个问题是如何在注释中使用代码标记?