如何从路径和文件名中删除非法字符?

13 浏览
0 Comments

如何从路径和文件名中删除非法字符?

我需要一种稳健且简单的方法来从一个简单的字符串中删除非法的路径和文件字符。我使用了下面的代码,但似乎没有任何作用,我错过了什么吗?\n

using System;
using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string illegal = "\"M<>\"\\a/ry/ h**ad:>> a\\/:*?\"<>| li*tt|le|| la\"mb.?";
            illegal = illegal.Trim(Path.GetInvalidFileNameChars());
            illegal = illegal.Trim(Path.GetInvalidPathChars());
            Console.WriteLine(illegal);
            Console.ReadLine();
        }
    }
}

0
0 Comments

如何从路径和文件名中删除非法字符?

问题的出现原因:有些用户反馈说上述方法对他们不起作用,返回的结果仍然是原始的字符串。还有些用户指出该方法只清理了文件名,而没有清理实际的路径,因为它将 "\" 视为非法字符。如果路径类似于 "\\MyServer\e$\demo\Output\Test\1111_joe_soap.pdf",返回的结果将是 "MyServere$demoOutputTest1111_joe_soap.pdf"。

解决方法:可以使用Linq来解决这个问题,如下所示:var invalid = new HashSet<char>(Path.GetInvalidPathChars()); return new string(originalString.Where(s => !invalid.Contains(s)).ToArray())。尽管性能可能不是很好,但这可能并不重要。

更新:为了验证该方法,我在下面提供了一个DotNetFiddle的链接,你可以在那里验证这个方法。[链接](https://dotnetfiddle.net/nw1SWY)

以下是一个使用Linq清理文件名的示例代码,你可以轻松地扩展它以检查有效路径。

private static string CleanFileName(string fileName)
{
    return Path.GetInvalidFileNameChars().Aggregate(fileName, (current, c) => current.Replace(c.ToString(), string.Empty));
}

上述方法可能对一些用户有效,但对于其他用户可能不起作用。如果你遇到了类似的问题,可以尝试使用上述的Linq解决方法来清理非法字符。

0
0 Comments

问题的原因是有时候文件路径和文件名中会包含非法字符,这可能导致一些问题。解决方法是使用代码来移除非法字符。

以下是可以尝试的一种解决方法:

string illegal = "\"M\"\\a/ry/ h**ad:>> a\\/:*?\"| li*tt|le|| la\"mb.?";
string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
foreach (char c in invalid)
{
    illegal = illegal.Replace(c.ToString(), ""); 
}

另一种解决方法是使用正则表达式:

string illegal = "\"M\"\\a/ry/ h**ad:>> a\\/:*?\"| li*tt|le|| la\"mb.?";
string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
illegal = r.Replace(illegal, "");

不过,问题还是要问一下,为什么要这样做。

0
0 Comments

问题的出现的原因是有人想要从路径和文件名中删除非法字符。

解决方法之一是使用以下代码来删除非法字符:

public string RemoveInvalidChars(string filename)

{

return string.Concat(filename.Split(Path.GetInvalidFileNameChars()));

}

另一种解决方法是使用以下代码来替换非法字符:

public string ReplaceInvalidChars(string filename)

{

return string.Join("_", filename.Split(Path.GetInvalidFileNameChars()));

}

这个答案来自另一个帖子,作者是Ceres,我觉得这个方法非常简洁明了。

为了准确回答提问者的问题,你需要使用""来替换非法字符,但实际上你的答案可能更适用于我们大多数人。我认为用合法字符替换非法字符更常见。

我测试了这个问题中的五种方法(循环100,000次),这个方法是最快的。正则表达式方法排名第二,比这个方法慢25%。

回应评论的问题,可以简单地使用string.Concat(name.Split(Path.GetInvalidFileNameChars()))来替换非法字符。

令人惊讶的是,Split/Join的代码的性能与foreach循环的性能相当。

0