DotNetCore:GetInvalidFileNameChars的跨平台版本?

时间:2017-11-05 09:15:27

标签: linux windows ubuntu operating-system .net-core

我正在构建一个可在Windows和Ubuntu系统上运行的.Net Core 2.0控制台应用程序。我有一个字符串需要转换为安全的文件名。目前我使用以下代码来实现此目的:

var safeName = string.Join("-", name.Split(Path.GetInvalidFileNameChars()));

它可以工作,但它会在不同的操作系统上产生不同的结果,因为Linux允许Windows不允许的字符。我喜欢在所有系统上产生相同结果的解决方案。

是否有跨平台版本的GetInvalidFileNameChars将返回所有平台的字符?

2 个答案:

答案 0 :(得分:0)

如下所示将起作用:

var invalidCharStr =

    //printable chars linux/unix
    "/" +

    //unprintable chars linux/unix
    Convert.ToChar(0) +

    //printable chars Windows
    @"><:""/\|?*" +

    //unprintable chars Windows: 0-31
    new string(Enumerable.Range(0, 32).Select(Convert.ToChar).ToArray());

将它们作为一个数组,如:

var invalidChars = invalidCharStr.ToArray();

答案 1 :(得分:0)

我认为BCL中没有“跨平台”版本,但是您可以通过复制Windows version of GetInvalidFileNameChars轻松地自己制作,因为Unix version只是其中的一部分而且它们不太可能经常更改:

        public static char[] GetInvalidFileNameChars() => new char[]
        {
            '\"', '<', '>', '|', '\0',
            (char)1, (char)2, (char)3, (char)4, (char)5, (char)6, (char)7, (char)8, (char)9, (char)10,
            (char)11, (char)12, (char)13, (char)14, (char)15, (char)16, (char)17, (char)18, (char)19, (char)20,
            (char)21, (char)22, (char)23, (char)24, (char)25, (char)26, (char)27, (char)28, (char)29, (char)30,
            (char)31, ':', '*', '?', '\\', '/'
        };