【问题标题】:Filesystem filename escape? C#文件系统文件名转义? C#
【发布时间】:2009-06-20 05:27:35
【问题描述】:

我允许用户选择他想要的任何用户名,它可以是任何用户名,例如

AC♀¿!$"Man'@

现在我需要为他创建一个目录。我用什么函数来转义文本,这样我就不会出现 FS 问题/异常?

【问题讨论】:

    标签: filesystems escaping


    【解决方案1】:

    无论是替换无效字符还是删除它们,都存在冲突的可能性。如果我是你,我会为用户设置一个单独的主键(也许是一个 GUID)并将其用作目录名称。这样您就可以使用任何您想要的用户名,而不必担心无效的目录名称。

    【讨论】:

    • 为什么不赞成匿名用户?我仍然相信这是一个更好的解决方案。否则,Bobby\ 和 Bobby/ 将获得相同的目录,这将导致冲突。
    • 问题是与文件名规则兼容的文本转义策略。通过创建和维护单独的数据结构来完全避免转义可能是解决问题的方法,但不能回答问题。
    • 嗯,我认为人们去 Stack Overflow 主要是为了解决他们的问题,而不仅仅是回答他们提出的问题。如果有人问错了问题,比如“我如何用正则表达式解析这个 HTML”,最好指出方法中的缺陷。
    • 实际上,我偶然发现了这个问题,因为我确实需要为文件名转义字符串,无法实现您的解决方法。换句话说,我遇到了问题所描述的确切问题。感谢您的努力,但问题是有效的,需要回答,而不是回避。
    【解决方案2】:

    根据您的字符是否为 ASCII/Unicode,您可以使用字节/字符值作为替换,并使用一些字符来标记这些替换的字符(如下划线),为您提供类似 _001_255_200ValidPart_095_253 的内容。请注意,您也必须替换标记字符(在示例中为_095,95 是下划线的 ASCII 码)。

    【讨论】:

    • 是的,但是选择一种编码方案是微不足道的。很难知道要转义哪些字符。
    • 虽然在这里转义太多字符不会真的很痛 - 所以你可以 f.e.只使用 A-Z,a-z,0-9 作为有效的
    【解决方案3】:

    使用Path.GetInvalidFileNameCharsPath.GetInvalidPathChars 检查要删除的字符。

    http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars.aspx

    【讨论】:

    • 并且一定要检查目录是否已经存在(检查重复的“用户名”)。
    • 这没有帮助。我需要无损转义,删除字符是有损的,并且在两个不同的名称删除字符后可能会导致冲突
    • 另请注意,虽然 GetInvalidPathChars() 返回无效字符,但它不一定返回所有无效字符。引用:“此方法返回的数组不保证包含文件和目录名称中无效的完整字符集。”
    • -1 像瘟疫一样避免使用此功能。这比它的价值更麻烦。正如 Bevan 所说,它不会返回所有无效字符,从而使其完全无用。
    • 如何将用户名转换为base46表示?
    【解决方案4】:

    我认为您最好的选择是创建一个将无效文件系统字符映射到有效替换字符串的字典。然后扫描字符串中的无效字符,随时替换为有效字符串。这将允许用户选择他们想要的任何内容,并让您在需要时将其转换回用户名。

    【讨论】:

    • 但请注意,您必须能够说出之后替换了哪些字符。将 $User 转换为 DollarUser 也无济于事。
    • 是的,但您可以创建一个不允许用户使用的字符序列。就像在 C# 中一样,当编译器为某些事情发出代码时。
    【解决方案5】:

    您不会找到一种方法来逃避用户名,​​从而在每个实例中都提供一个有效的非冲突目录名称。

    更可靠的方法是使用任意约定创建目录,然后存储两者之间的映射。这也为您的用户想要更改名称的情况提供支持。

    查看问题 #663520 了解更多信息。

    【讨论】:

      【解决方案6】:

      用户是否需要知道他/她的目录的确切名称?如果没有,为什么不使用任意规则创建目录并将每个目录与数据库中的所有者相关联?

      【讨论】:

      • 那行得通,我总是可以使用用户 ID 而不是名称。我只想要名字 bc 它对管理员来说更具可读性,尽管可能毫无意义。
      猜你喜欢
      • 2012-08-22
      • 1970-01-01
      • 2014-05-09
      • 2010-10-19
      • 2021-06-03
      • 2011-03-20
      • 2016-09-23
      • 1970-01-01
      • 2010-10-05
      相关资源
      最近更新 更多