Chr*_*bek 439
让我们保持简单并首先回答问题.
禁止打印的ASCII字符是:
的Linux/Unix:
/ (forward slash)
Run Code Online (Sandbox Code Playgroud)视窗:
< (less than)
> (greater than)
: (colon - sometimes works, but is actually NTFS Alternate Data Streams)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)
Run Code Online (Sandbox Code Playgroud)不可打印的字符
如果您的数据来自允许不可打印字符的来源,则需要检查更多内容.
的Linux/Unix:
0 (NULL byte)
Run Code Online (Sandbox Code Playgroud)视窗:
0-31 (ASCII control characters)
Run Code Online (Sandbox Code Playgroud)注意:虽然在Linux/Unix文件系统下创建文件名中包含控制字符的文件是合法的,但用户处理此类文件可能是一场噩梦.
保留的文件名
以下文件名是保留的:
视窗:
CON, PRN, AUX, NUL
COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
Run Code Online (Sandbox Code Playgroud)
(例如,他们自己和任意文件扩展名LPT1.txt
).
其他规则
视窗:
文件名不能以空格或点结尾.
Dou*_*rch 204
禁用文件名字符的"综合指南"在Windows上不起作用,因为它保留了文件名和字符.是的,*
"
?
禁止使用像和其他人一样的字符
,但是有无数个名称仅由禁止使用的有效字符组成.例如,空格和点是有效的文件名字符,但禁止仅由这些字符组成的名称.
Windows不区分大写字符和小写字符,因此A
如果a
已存在名称,则无法创建命名文件夹.更糟糕的是,看似允许的名称PRN
和CON
,以及许多其他名称都是保留的,不允许使用.Windows也有几个长度限制; 如果移动到另一个文件夹,在一个文件夹中有效的文件名可能会无效 命名文件和文件夹的规则
在MSDN上.
通常,您不能使用用户生成的文本来创建Windows目录名称.如果你想允许用户名字,他们想要的东西,你必须创建安全的名字,如A
,AB
,A2
等,存储用户生成的名称和应用程序数据文件的路径等价物,并在你的应用程序中执行路径映射.
如果绝对必须允许用户生成的文件夹名称,则判断它们是否无效的唯一方法是捕获异常并假设名称无效.即使这样也充满了危险,因为拒绝访问,脱机驱动器和驱动器空间的异常与可能因无效名称而被抛出的异常重叠.你正在开辟一个巨大的伤害.
Jon*_*ler 62
在Linux和其他与Unix相关的系统中,只有两个字符不能出现在文件或目录的名称中,而且它们是NUL '\0'
和斜杠'/'
.当然,斜杠可以出现在路径名中,将目录组件分开.
谣言1认为Steven Bourne('shell'成名)有一个包含254个文件的目录,每个单个字母(字符代码)一个可以出现在文件名中(不包括/
,'\0'
;名称.
是当前目录,当然).它被用来测试Bourne shell,并经常对诸如备份程序之类的粗心计划造成严重破坏.
其他人已经涵盖了Windows规则.
请注意,MacOS X具有不区分大小写的文件系统.
当Steve Bourne编写他的Unix shell(后来被称为Bourne shell)时,他创建了一个包含一个字符名称的254个文件的目录,每个字节值除了一个字符值
'\0'
和斜杠,这两个字符在Unix中不能出现文件名.他使用该目录进行模式匹配和标记化的各种测试.(测试目录当然是由程序创建的.)多年后,该目录是文件树行走程序的祸根; 它测试了它们的破坏.
Aeo*_*ime 32
您可以使用白名单,而不是创建字符黑名单.考虑到所有因素,在文件或目录名称上下文中有意义的字符范围很短,除非您有一些非常具体的命名要求,否则如果用户不能使用整个ASCII表,则用户不会将其保留在应用程序中.
它不能解决目标文件系统中保留名称的问题,但使用白名单可以更轻松地降低源上的风险.
本着这种精神,这是一系列可以被认为是安全的角色:
以及您希望允许的任何其他安全字符.除此之外,您还必须执行一些有关空格和点的其他规则.这通常就足够了:
这已经允许非常复杂和荒谬的名称.例如,这些名称可以使用这些名称,并且是Windows/Linux中的有效文件名:
A...........ext
B -.- .ext
从本质上讲,即使白名单字符很少,您仍然应该确定实际有意义的内容,并相应地验证/调整名称.在我的一个应用程序中,我使用了与上面相同的规则,但剥离了任何重复的点和空格.
Leo*_*era 28
好吧,如果仅用于研究目的,那么最好的办法是查看文件名上的维基百科条目.
如果你想编写一个可移植的函数来验证用户输入并根据它创建文件名,那么简短的答案就是不这样做.看看像Perl的File :: Spec这样的便携式模块,可以一瞥完成这种"简单"任务所需的所有跳跃.
小智 26
让Windows告诉您答案的简单方法是尝试通过资源管理器重命名文件并输入/为新名称.Windows将弹出一个消息框,告诉您非法字符列表.
A filename cannot contain any of the following characters:
\ / : * ? " < > |
Run Code Online (Sandbox Code Playgroud)
https://support.microsoft.com/en-us/kb/177506
与界定困难,什么是合法的,而不是被已经不客气和白名单被提出。但是 Windows支持超过 8 位的字符。维基百科指出,(例如)
修饰符字母冒号[(参见下面的 7.)是] 有时用于 Windows 文件名,因为它与用于文件名的Segoe UI字体中的冒号相同。[继承的 ASCII] 冒号本身是不允许的。
因此,我想提出一种更自由的方法,使用 Unicode 字符替换“非法”字符。我发现我的可比用例中的结果更具可读性。此外,您甚至可以从替换中恢复原始内容。
为了使事情井井有条,我将始终给出字符、名称和十六进制数字表示。这不区分大小写,可以自由添加或省略前导零,因此例如U+002A
和u+2a
是等效的。如果可用,我会尝试指出更多信息或替代方案 - 请随时向我展示更多或更好的信息。
U+2A * ASTERISK
),您可以使用列出的众多方法之一,例如U+2217 ? (ASTERISK OPERATOR)
或Full Width Asterisk U+FF0A ?
。我还包括了Wally Brockway 的回答的一些好的建议,在这种情况下u+20f0 ? combining diacritical marks for symbols
- 从现在开始我将用?.U+2E . full stop
),这些之一可能是一个不错的选择,例如? U+22C5 dot operator
U+22 * quotation mark
),您还可以使用“ U+201C english leftdoublequotemark
, u+2036 ? reversed double prime
? 或者u+2033 ? double prime
?
(替代方案见这里)U+2F / SOLIDUS
),您可以使用? DIVISION SLASH U+2215
(others here ) 或u+2044 ? fraction slash
?\
( U+5C Reverse solidus
),您可以使用? U+29F5 Reverse solidus operator
( more ) 或u+20E5 ? combining reverse solidus overlay
?U+5B [ Left square bracket
) 和]( U+005D ] Right square bracket
),您可以使用例如U+FF3B? FULLWIDTH LEFT SQUARE BRACKET
和U+FF3D ?FULLWIDTH RIGHT SQUARE BRACKET
(从这里开始,更多可能性在这里)u+3a : colon
),(请参阅冒号(字母),有时在 Windows 文件名中使用,因为它与用于文件名的Segoe UI字体中的冒号相同。冒号本身是不允许的......源和更多替换见这里)。另一种选择是这个:U+2236 ? RATIO (for mathematical usage)
U+A789 ? MODIFIER LETTER COLON
u+1361 ? ethiopic wordspace
?u+3b ; semicolon
),您可以使用U+037E ? GREEK QUESTION MARK
(请参阅此处) )u+7c | vertical line
),有一些很好的替代品,例如:U+2223 ? DIVIDES
, U+0964 ? DEVANAGARI DANDA
, U+01C0 ? LATIN LETTER DENTAL CLICK
(维基百科的最后一个)或U+2D4F ? Tifinagh Letter Yan
。还有框画人物包含各种其他选项。, U+002C COMMA
),您可以使用例如‚ U+201A SINGLE LOW-9 QUOTATION MARK
(参见此处)U+003F ? QUESTION MARK
),这些是很好的候选者:U+FF1F ? FULLWIDTH QUESTION MARK
或者U+FE56 ? SMALL QUESTION MARK
(从这里和这里)还有两个来自Dingbats 块(搜索“问题”)和u+203d ? interrobang
?>
( u+3e greater-than sign
) 和<
( u+3c less-than sign
) 。这里最好的替换可能也来自引用块,例如 u+203a › single right-pointing angle quotation mark
和u+2039 ‹ single left-pointing angle quotation mark
分别。tifinagh 块只包含? (u+2D66)
? 替换<
. 最后一个概念是? less-than with dot u+22D6
和? greater-than with dot u+22D7
。对于其他想法,您还可以查看此块的示例。
假设您要键入? (Tifinagh Letter Yan)
. 要获取其信息,您始终可以在合适的平台上搜索此字符,例如Unicode Lookup(搜索十六进制时添加 0x)或此Unicode 表(仅允许搜索名称,在这种情况下为“Tifinagh Letter”颜”)。您应该获得它的 Unicode 编号U+2D4F
和 HTML 代码ⵏ
- 请注意,2D4F
对于11599
. 有了这些知识,您有多种选择来生成这些特殊字符,包括使用
:?*:altpipe::{U+2D4F}
输入?
而不是字符串altpipe
- 这是我输入这些特殊字符的方式,如果有共同的兴趣,我的 Autohotkey 脚本可以共享在 Windows 10 (2019) 中,尝试输入以下字符时会出现错误,禁止使用这些字符:
文件名不能包含以下任何字符:
小智 5
对于Windows,您可以使用PowerShell进行检查
$PathInvalidChars = [System.IO.Path]::GetInvalidPathChars() #36 chars
Run Code Online (Sandbox Code Playgroud)
要显示UTF-8代码,您可以转换
$enc = [system.Text.Encoding]::UTF8
$PathInvalidChars | foreach { $enc.GetBytes($_) }
$FileNameInvalidChars = [System.IO.Path]::GetInvalidFileNameChars() #41 chars
$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference
Run Code Online (Sandbox Code Playgroud)