我知道/在Linux中是非法的,下面这些在Windows中是非法的 (我认为)*。" / \ []:;|,

我还遗漏了什么?

然而,我需要一份全面的指南,一份考虑到各种因素的指南 双字节字符。链接到外部资源对我来说很好。

我需要首先在文件系统上创建一个目录,其名称可能是 包含禁用字符,所以我计划将这些字符替换为 下划线。然后,我需要将这个目录及其内容写入一个zip文件 (使用Java),因此关于zip目录名称的任何其他建议 不胜感激。


当前回答

对于任何寻找正则表达式的人:

const BLACKLIST = /[<>:"\/\\|?*]/g;

其他回答

您可以使用白名单,而不是创建字符黑名单。考虑到所有因素,在文件或目录名称上下文中有意义的字符范围非常短,除非您有一些非常特定的命名要求,否则如果用户不能使用整个ASCII表,他们不会反对您的应用程序。

它不能解决目标文件系统中保留名称的问题,但是使用白名单可以更容易地降低源上的风险。

本着这种精神,这是一个可以被认为是安全的字符范围:

字母(a-z a-z) -如果需要,也可以使用Unicode字符 数字(0 - 9) 下划线(_) 连字符(-) 空间 点号(.)

以及您希望允许的任何其他安全字符。除此之外,您还必须执行一些关于空格和点的附加规则。这通常就足够了:

名称必须包含至少一个字母或数字(以避免只有点/空格) 名称必须以字母或数字开头(以避免前导点/空格) 名称不能以点或空格结尾(如果存在,只需修剪它们,就像资源管理器一样)

这已经允许相当复杂和无意义的名称。例如,在这些规则下,这些名称是可能的,并且在Windows/Linux中是有效的文件名:

一个 ........... ext B -。- - - - - - ext

从本质上讲,即使白名单上的角色很少,你仍然应该决定什么是真正有意义的,并相应地验证/调整名称。在我的一个应用程序中,我使用了与上面相同的规则,但去掉了任何重复的点和空格。

要让Windows告诉你答案,最简单的方法是尝试通过资源管理器重命名文件,并输入反斜杠/作为新名称。Windows会弹出一个消息框,告诉你非法字符的列表。

A filename cannot contain any of the following characters:
    \ / : * ? " < > | 

微软文档-命名文件,路径和命名空间-命名约定

截至2017年4月18日,这个话题的答案中没有简单的字符和文件名的黑白列表,而且有很多回复。

我能想到的最好的建议是让用户随意命名文件。当应用程序试图保存文件时,使用错误处理程序,捕捉任何异常,假定是文件名造成的错误(显然在确保保存路径也正确之后),并提示用户输入新的文件名。为了获得最好的结果,将这个检查过程放在一个循环中,直到用户正确或放弃为止。对我来说是最好的工作(至少在VBA)。

在Windows中创建internet快捷方式时,为了创建文件名,它会跳过非法字符,除了正斜杠被转换为减号。

我也有同样的需求,正在寻找推荐信或标准推荐信,偶然发现了这条线索。我目前在文件和目录名中应该避免的字符黑名单是:

$CharactersInvalidForFileName = {
    "pound" -> "#",
    "left angle bracket" -> "<",
    "dollar sign" -> "$",
    "plus sign" -> "+",
    "percent" -> "%",
    "right angle bracket" -> ">",
    "exclamation point" -> "!",
    "backtick" -> "`",
    "ampersand" -> "&",
    "asterisk" -> "*",
    "single quotes" -> "“",
    "pipe" -> "|",
    "left bracket" -> "{",
    "question mark" -> "?",
    "double quotes" -> "”",
    "equal sign" -> "=",
    "right bracket" -> "}",
    "forward slash" -> "/",
    "colon" -> ":",
    "back slash" -> "\\",
    "lank spaces" -> "b",
    "at sign" -> "@"
};