DotNetCore:GetInvalidFileNameChars 的跨平台版本?

Posted

技术标签:

【中文标题】DotNetCore:GetInvalidFileNameChars 的跨平台版本?【英文标题】:DotNetCore: cross platform version of GetInvalidFileNameChars? 【发布时间】:2018-04-17 14:42:43 【问题描述】:

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

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

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

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

【问题讨论】:

您可以手动将任何非字母数字字符替换为“-”。这是一种保守但安全的方式。 所以我可以使用白名单代替黑名单? Alhpa 数字字符在 Windows 和 Linux 上均有效。仅使用这些字符在两个平台上都有效。 还可以安全地包含减号下划线、句点、空格和其他一些内容。 Linux 将允许除斜杠和 NUL 之外的所有内容——应避免加上冒号。 Windows 是限制器。排除 Windows 路径和流分隔符(斜杠、反斜杠和冒号)、通配符(星号、问号、小于、大于和双引号)、ASCII 控制字符 (0-31) 和管道 (|)。也不要以句点或空格结尾文件名,因为 Windows 会将其删除。并且不要使用保留的 DOS 设备名称:NUL、CON、CONIN$、CONOUT$、AUX、PRN、COM1-COM9 和 LPT1-LPT9。 【参考方案1】:

我认为 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, ':', '*', '?', '\\', '/'
        ;

【讨论】:

【参考方案2】:

看起来以下将起作用:

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

【讨论】:

以上是关于DotNetCore:GetInvalidFileNameChars 的跨平台版本?的主要内容,如果未能解决你的问题,请参考以下文章

从 DotNetCore 迁移到 NodeJS

DotNetCore.NPOI 总是创建损坏的文件

DotNetCore 3.0 助力 WPF 开发

DotNetCore:GetInvalidFileNameChars 的跨平台版本?

通过Jexus 部署 dotnetcore

Linux 上的单实例 dotnetcore cli 应用程序