【问题标题】:Remove invalid (disallowed, bad) characters from FileName (or Directory, Folder, File) [duplicate]从文件名(或目录、文件夹、文件)中删除无效(不允许、错误)字符[重复]
【发布时间】:2011-01-14 21:47:00
【问题描述】:

我已经写了这个小方法来实现主题中的目标。但是,有没有更有效(更简单)的方法来做到这一点?我希望这可以帮助像我一样搜索这个的人。

var fileName = new System.Text.StringBuilder();
fileName.Append("*Bad/\ :, Filename,? ");
// get rid of invalid chars
while (fileName.ToString().IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) > -1)
{
    fileName = fileName.Remove(fileName.ToString().IndexOfAny(System.IO.Path.GetInvalidFileNameChars()), 1);
}

?

【问题讨论】:

    标签: c# asp.net .net


    【解决方案1】:

    我知道这已经有几年的历史了,但这里有另一种解决方案供参考。

    public string GetSafeFilename(string filename)
    {
    
        return string.Join("_", filename.Split(Path.GetInvalidFileNameChars()));
    
    }
    

    【讨论】:

    • 几年后,无论如何,这是一个非常聪明的解决方案。截至 2014 年,仍然是我要使用的,而不是 Regex.Replace。 =D
    • 是的。最佳解决方案。它还表明阅读整个线程(并回答旧问题)是值得的。谢谢,谷神星。
    • @Rob GetInvalidFileNameChars() 确实包含“\”和“/”。此例程假定您仅传递文件名。如果您正在检查文件路径的一部分,则可以改用Path.GetInvalidPathChars()
    • 我以此作为扩展方法的基础。
    【解决方案2】:

    试试下面的

    public string MakeValidFileName(string name) {
      var builder = new StringBuilder();
      var invalid = System.IO.Path.GetInvalidFileNameChars();
      foreach ( var cur in name ) {
        if ( !invalid.Contains(cur) ) {
          builder.Append(cur);
        }
      }
      return builder.ToString();
    }
    

    【讨论】:

    • invalid.Contains(cur) 在 .NET 4 中似乎对我不起作用。收到消息“无法在此处访问私有方法”。想出了下面发布的另一个示例。
    • 使用 System.Linq 添加到顶部。
    【解决方案3】:

    与 .NET 4 兼容的不同方法。请参阅上面的我的 cmets 解释需求。

    public static string ScrubFileName(string value)
    {
       var sb = new StringBuilder(value);
       foreach (char item in Path.GetInvalidFileNameChars())
       {
          sb.Replace(item.ToString(), "");
       }
       return sb.ToString();
    }
    

    【讨论】:

    • -1 不使用StringBuilder
    【解决方案4】:

    如果你说简单时寻找“简洁”:

    public string StripInvalidChars(string filename) {
      return new String(
        filename.Except(System.IO.Path.GetInvalidFileNameChars()).ToArray()
      );
    }
    

    也就是说,我会选择 JaredPar 的解决方案。它可能更容易阅读(取决于口味,背景),我的直觉是它更有效(尽管我不确定从有限长度的文件名中剥离十几个无效字符的效率)和他的使用的 StringBuilder() 似乎非常适合您的示例。

    【讨论】:

    • 我不相信 except 方法做你想要的。它实际上不适用于重复项。 “[Except] 方法返回第一个中没有出现在第二个中的那些元素。它也不会返回第二个中没有出现在第一个中的那些元素。”通过msdn.microsoft.com/en-us/library/bb300779.aspx
    • @ChronoPositron:启发我:问题是什么?我想要“那些第一个没有出现在第二个的元素”(即不是无效的字符)。我不想要“第二个中没有出现在第一个中的那些元素”(即不存在的无效字符)。
    • @Bejamin Podszun:问题在于,除了作为集合操作工作。例如,如果我将“aaabbb.txt”(这是一个有效的文件名)传递给您的函数,则结果值为“ab.tx”。它只保留每个字母的第一次出现,这使得它不仅仅删除了无效字符;它改变了函数的预期结果。
    • @ChronoPositron:哇,你现在找到我了。我之前错过了“设置”部分,当我在 LINQPad 中使用 OP 的 testdata 快速测试它时,我只注意到删除的无效字符(好)而不是丢失的有效元素(坏)。对不起,我很慢,谢谢你启发我。
    • 能否编辑您的帖子并添加警告?
    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2011-04-19
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多