.net 如何在多个FS上转义文件名中的无效字符

.net 如何在多个FS上转义文件名中的无效字符,.net,filesystems,escaping,.net,Filesystems,Escaping,如何转义文件名中的无效字符?我写了一个带解决方案的类。现在我想扩展它。我的网站将能够检测到用户的操作系统。因此,在此基础上,我要么1)希望根据用户所在的FS/OS进行转义,要么2)转义,使其在所有文件系统上工作 哪些字符可能在windows 7或linux上有效(我不确定当前的linux FS设置为什么),哪些字符在XP上无效,哪些字符在windows或mac上有效,哪些字符在linux上无效?目录名称是否会显示给用户,如果是,它是否需要看起来像用户名(基于另一个问题中的信息)?如果不是,您可以

如何转义文件名中的无效字符?我写了一个带解决方案的类。现在我想扩展它。我的网站将能够检测到用户的操作系统。因此,在此基础上,我要么1)希望根据用户所在的FS/OS进行转义,要么2)转义,使其在所有文件系统上工作


哪些字符可能在windows 7或linux上有效(我不确定当前的linux FS设置为什么),哪些字符在XP上无效,哪些字符在windows或mac上有效,哪些字符在linux上无效?

目录名称是否会显示给用户,如果是,它是否需要看起来像用户名(基于另一个问题中的信息)?如果不是,您可以将其拆分为字符数组,将每个字符的值转换为其十六进制表示形式,并将它们合并为字符串。这应该适用于任何文件系统

private static string ToHexString(string input)
{
    return string.Join("", input.ToCharArray()
        .Select(c => string.Format("{0:x}", (int)c))
        .ToArray());
}

目录的名称是否会显示给用户?如果是,它是否需要看起来像用户名(基于另一个问题中的信息)?如果不是,您可以将其拆分为字符数组,将每个字符的值转换为其十六进制表示形式,并将它们合并为字符串。这应该适用于任何文件系统

private static string ToHexString(string input)
{
    return string.Join("", input.ToCharArray()
        .Select(c => string.Format("{0:x}", (int)c))
        .ToArray());
}
解决方案

  • 使其
    [A-Za-z.-]
    并转义不在范围内的字符
  • 选择您支持的OS和FS,找出哪些是非法的,哪些不是,并支持这些,直到另行通知
  • 解决方案

  • 使其
    [A-Za-z.-]
    并转义不在范围内的字符
  • 选择您支持的OS和FS,找出哪些是非法的,哪些不是,并支持这些,直到另行通知

  • POSIX系统(包括Linux)上的文件名中的有效字符是除“/”和“\x00”之外的所有字符。这不是真的。保证工作的唯一字符是可移植文件名字符集中的字符,在第3.276节中定义为
    abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789。此外,长度超过14个字符的文件名也不能保证工作。现在,如果您正在编写一个处理文件名的应用程序,那么您是对的:您一定要确保在提交一个由40亿个换行符组成的文件名时不会爆炸。在POSIX系统(包括Linux)上,文件名中的有效字符除了“/”和“\x00”之外都是。这不是真的。保证工作的唯一字符是可移植文件名字符集中的字符,在第3.276节中定义为
    abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789。此外,长度超过14个字符的文件名也不能保证工作。现在,如果你正在编写一个处理文件名的应用程序,那么你是对的:你应该确保当你收到一个由40亿个换行符组成的文件名时,你不会崩溃。我已经有了一个解决方案。我只需要更多的测试和一种方法,让其他文件系统(即不在我的服务器上)在用户试图从我的网站下载时不会崩溃。顺便说一句,我更喜欢使用十六进制2位(
    {0:X2}
    ),所以不要将十六进制值与下面的字母混淆,我在它前面使用了%,因此它是转义的(我也是转义的%),我已经有了转义的解决方案。我只需要更多的测试和一种方法,让其他文件系统(即不在我的服务器上)在用户试图从我的网站下载时不会崩溃。顺便说一句,我更喜欢使用十六进制2位(
    {0:X2}
    ),因此不要将十六进制值与下面的字母混淆,我在它前面使用了%,因此它是转义的(我也转义%)