Windows和Linux目录名中禁止使用哪些字符?

您所在的位置:网站首页 文件夹名称不能包括的符号是 Windows和Linux目录名中禁止使用哪些字符?

Windows和Linux目录名中禁止使用哪些字符?

2024-05-22 13:02| 来源: 网络整理| 查看: 265

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

我还缺少什么?

但是,我需要一份全面的指南,并考虑到这一指南 双字节字符。 链接到外部资源对我来说没问题。

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

相关讨论 实际上,在Windows上允许提及的一些字符。检查一下:echo abc >"ab.;,=[1]" 您可能想要使用encodeURIComponent(Javascript)或等效的。 也不要忘记在Windows上是非法的。 仅仅因为win32 API传递它并不意味着它被允许。在Windows上使用RCS和CVS之前,首先阅读NTFS规范和FAT32规范。 /在Linux中不是非法的。你输入时只需要用来逃避它。 FAT禁止^ 我使用base64编码,相当节省,人们可能也可以使用urlencoding更好地阅读fs。但在Windows上是的,案件问题仍然存在。你可以使用base32编码更安全但是你有长文件名问题。这是一个权衡 @DavidC.Bishop:这篇SO帖子断言Linux内核会阻止你使用包含斜杠的文件名。你能使它工作吗? "/在Linux中不是非法的。你只需要在输入时用来逃避它" - 这句话是完全错误的。 filename组件不能包含/,并且转义它没有任何效果。 我只在NTFS上测试,可以这么说。 [] =:;而且,看起来很好。我没有测试FAT32

让我们保持简单并首先回答问题。

禁止打印的ASCII字符是:

的Linux / Unix:

1/ (forward slash)

视窗:

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

不可打印的字符

如果您的数据来自允许不可打印字符的来源,则需要检查更多内容。

的Linux / Unix:

10 (NULL byte)

视窗:

10-31 (ASCII control characters)

注意:虽然在Linux / Unix文件系统下创建文件名中包含控制字符的文件是合法的,但用户处理此类文件可能是一场噩梦。

保留的文件名

以下文件名是保留的:

视窗:

123CON, PRN, AUX, NUL COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9 LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9

(它们都是自己的,并且具有任意文件扩展名,例如LPT1.txt)。

其他规则

视窗:

文件名不能以空格或点结尾。

相关讨论 大多数Windows文件系统不限于8位字符。 Windows上禁止使用许多其他8位字符(NUL,控制字符)。即使考虑到那些也不允许提问者"在文件系统上创建一个目录",因为他提出了无限数量的无效目录名称,这些目录名称由非禁止字符组成。 其他人已经说过,这不是建设性的。当我来到这里寻找答案时,我想要我必须在其他地方收集的列表:在创建有效文件名的良好尝试时,从用户输入过滤掉哪些字符。如果角色一起变得无效的问题,也可能需要一些细化。 Linux上也禁止使用NULL字符。 还有换行符和其他控制字符 Linux上不禁止换行。我们认为他们应该是......但是如果NUL在Linux上被禁止,那么它在Windows上被禁止,它就会达到同样的目的。 在DOS和Windows中,驱动器号后缀为:ntfs不允许它作为特定文件名的一部分,而是文件路径的一部分。示例:Linux上的C: ABCD GHI.TXT一旦安装的路径看起来像/mnt/c/ABCD/GHI.TXT你可以在Linux中双引用一个有空格的文件路径来创建,删除等。与windows相同。 DOS依赖于lfndos驱动程序 Linux不禁止Windows非法字符? @Soaku:当然不是,因为世界并非围绕着微软。为什么只有两个绝对必要的字符禁止时添加不必要的限制? @firegurafiku哦,好的。谢谢 @firegurafiku实际上没有任何字符"绝对必要"禁止。它始终妥协。甚至 0。 @LogicDaemon,我同意\0并非"绝对必要"禁止(如果C有更好的字符串处理,它将被允许),但至少应禁止斜杠字符,除非将文件路径表示为XML节点或其他东西。 @firegurafiku"/"只是惯例 - dirnames无论如何都是彼此分开存储的,因此/可以出现在名称中而没有问题(如果允许)。如果在路径中的目录/文件名中使用,则必须对其进行筛选,但这也适用于许多其他字符。处理 0将涉及在任何地方单独存储字符串长度,这实际上更难。 "CONIN $"和"CONOUT $"也被保留。与"CON"不同,它们允许通过读写访问访问控制台输入和屏幕缓冲区。在Windows 8之前,仅保留基本文件名。从Windows 8开始,底层控制台IPC被重新设计为使用设备驱动程序,因此这两个名称现在通常作为DOS设备处理,与"NUL"相同,等等。这意味着它们可以在本地设备路径中使用,例如"\。 CONIN $"和"\? CONOUT $"以及API假装每个现有目录中都存在名称。例如,"C: Temp CONOUT $"引用控制台输出。 请注意,在将DOS路径转换为本机NT路径时,运行时库会应用保留的DOS设备名称以及以点或空格结尾的文件名规则。如果路径以"\?"开头本地设备前缀,跳过此规范化步骤,除了替换"\?"与NTs" ??"设备前缀。此前缀指示对象管理器在登录会话和全局DOS设备目录中搜索到本机NT设备的符号链接,该设备通常是" Device"目录中的设备对象。 OTOH,保留字符不仅仅是DOS命名空间的功能。它们在内核和文件系统中保留在较低级别。""字符是NTs路径分隔符,由对象管理器保留。对象名称中允许包含其他所有内容,其中包括DOS设备名称,如"C:"。其他保留字符(包括ASCII控制字符)是由Microsoft文件系统使用的内核文件系统运行时库引起的。这些字符在主文件名中保留,而不是在流名称中保留。 *?"字符保留为通配符。这是由于一个特殊的设计决定让文件系统在NtQueryDirectoryFile系统调用的实现中实现了低级别的目录列表过滤。在POSIX系统中,这是在应用程序级别实现的。 您可以在大多数Linux发行版上使用正斜杠命名文件就好了。但是检索它可能会有问题。它不是被禁止的,它只是愚蠢的。您可以在shell外部创建一个文件(它会自动将解析为路径分隔符),例如使用C程序或Python脚本。 "你可以在大多数Linux发行版上用正斜杠命名一个文件就好了。" - 不,你不能。 /始终被内核视为目录分隔符,而不仅仅是shell。没有办法用C程序或Python脚本或任何其他方式解决这个问题。 有趣的事实:使用Cygwin,您可以轻松创建lpt1和lpt1.txt。然后尝试在Windows资源管理器中删除它们:你不能。或者在cmd.exe:你不能。但是Cygwin可以。它似乎是20世纪80年代限制人工帮助。

禁用文件名字符的"综合指南"在Windows上不起作用,因为它保留了文件名和字符。是的,人物喜欢 * " ?和其他人是被禁止的,但是有无数个名称仅由禁止的有效字符组成。例如,空格和点是有效的文件名字符,但禁止仅由这些字符组成的名称。

Windows不区分大写字符和小写字符,因此如果已存在名为A的文件,则无法创建名为A的文件夹。更糟糕的是,看似允许的名称,如PRN和CON,以及许多其他名称,都是保留的,不允许使用。 Windows也有几个长度限制;如果移动到另一个文件夹,在一个文件夹中有效的文件名可能会无效规则 命名文件和文件夹 在MSDN上。

通常,您不能使用用户生成的文本来创建Windows目录名称。如果要允许用户命名他们想要的任何内容,则必须创建安全名称,如A,AB,A2等,在应用程序数据文件中存储用户生成的名称及其路径等价物,以及在您的应用程序中执行路径映射

如果绝对必须允许用户生成的文件夹名称,则判断它们是否无效的唯一方法是捕获异常并假设名称无效。即使这样也充满了危险,因为拒绝访问,脱机驱动器和驱动器空间的异常与可能因无效名称而被抛出的异常重叠。你正在开辟一个巨大的伤害。

相关讨论 优点。如果我只记得COPY CON的意思...... 来自MSDN链接的关键短语是"[和]一个目标文件系统不允许的其他字符"。 Windows上可能有不同的文件系统。有些可能允许使用Unicode,有些可能不允许。通常,验证名称的唯一安全方法是在目标设备上尝试它。 有一些指导方针,"有无数个名称仅由有效字符组成的禁止"不具有建设性。同样"Windows不区分大写和小写字符"是一个愚蠢的例外 - OP询问语法而不是语义,没有正确的人会说像A.txt这样的文件名是无效的,因为A.txt可能存在。 您不应允许用户访问文件结构地址的想法是合理的,但措辞非常差。用户应该能够检查和操作应用程序向其公开的实体。虽然这些实体可能是动态命名的多个数据库的摘要,但向用户询问文件名是没有错的。申请中的证券应防止用户犯错并超越其权限;他们不应该阻止他们做他们需要做的事情 我经常使用Perl,我的习惯是使用引用为q的字符串,因为和>在Windows文件路径中都不是有效的。我怀疑这些限制是过时的,旨在避免在DOS环境中重要的字符,或至少在Windows命令shell中 COPY CON PRN表示从键盘输入或可能的标准输入读取,并将其复制到打印机设备。不确定它在现代窗户上是否仍然有效,但肯定是很长一段时间。在过去,您可以使用它来键入文本,并使用点阵式打印机输出它。 "不是建设性的" - 相反,它是一个事实。什么是建设性的是鲍罗丁的好战。 "通常,您不能使用用户生成的文本来创建Windows目录名称。" 这种观察"你通常不能使用用户生成的文本来创建Windows目录名称",说实话有点荒谬。在很多情况下,您希望允许用户命名他们的文件和文件夹,所以只是说"不要这样做"没有用。

在Linux和其他与Unix相关的系统中,只有两个字符不能出现在文件或目录的名称中,它们是NUL '\0'和斜杠'/'。当然,斜杠可以出现在路径名中,将目录组件分开。

Rumour1认为Steven Bourne('shell'成名)有一个包含254个文件的目录,每个字母(字符代码)一个可以出现在文件名中(不包括/,'\0';名称当然是当前目录)。它被用来测试Bourne shell,并且经常对诸如备份程序之类的粗心计划造成严重破坏。

其他人已经涵盖了Windows规则。

请注意,MacOS X具有不区分大小写的文件系统。

1编程实践中的Kernighan&Pike在第6章测试,§6.5压力测试中说了很多:

When Steve Bourne was writing his Unix shell (which came to be known as the Bourne shell), he made a directory of 254 files with one-character names, one for each byte value except '\0' and slash, the two characters that cannot appear in Unix file names. He used that directory for all manner of tests of pattern-matching and tokenization. (The test directory was of course created by a program.) For years afterwards, that directory was the bane of file-tree-walking programs; it tested them to destruction.

请注意,该目录必须包含条目.和..,因此可以说是253个文件(和2个目录),或255个名称条目,而不是254个文件。这不会影响轶事的有效性,也不会影响它所描述的仔细测试。

相关讨论 254个文件?那utf8怎么样? 254个文件都是单字符文件名,文件名中允许的每个字符一个。当史蒂夫伯恩写下Bourne外壳时,UTF-8甚至不是眼前一亮。 UTF-8对有效的字节序列施加规则(并且完全不允许字节0xC0,0xC1,0xF5-0xFF)。否则,它没有太大的不同 - 在我讨论的细节层面。 MacOS HFS +文件系统的磁盘目录分隔符实际上是:而不是/。当您使用* nix API时,操作系统通常(可能总是)做正确的事情。但是如果你要转向OSX世界,不要期望这种情况可靠地发生,例如:与applescript。看起来Cocoa API可能使用/并隐藏了:来自你,但我很确定旧的Carbon API不行。 @DanPritts我在Xcodes首选项中创建了一个自定义字体/颜色方案,并在名称中用命名。这引起了一些问题,因为它创建了一个带有该方案的新目录。

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

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

本着这种精神,这是一系列可以被认为是安全的角色:

字母(a-z A-Z) - 如果需要,也可以是Unicode字符 数字(0-9) 下划线(_) 连字符( - ) 空间 点(。)

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

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

这已经允许非常复杂和荒谬的名称。例如,这些名称可以使用这些名称,并且是Windows / Linux中的有效文件名:

A...........ext B -.- .ext

从本质上讲,即使白名单字符很少,您仍然应该确定实际有意义的内容,并相应地验证/调整名称。在我的一个应用程序中,我使用了与上面相同的规则,但剥离了任何重复的点和空格。

相关讨论 那些非英语用户怎么样呢?谁都会被这个搞砸? @pkh:正如我在帖子中提到的,你将在白名单中包含任何所需的unicode字符。通常可以非常容易地指定字符范围,尤其是在使用正则表达式时。 我们使用白名单方法,但不要忘记在Windows上你必须管理保留的,与案例无关的字符串,如设备名称(prn,lpt1,con)和。和.. 在DOS中, - (连字符)是不允许的。 command.com我认为根据DOS的类型将其转换为_或忽略它。 @pkh简单到足以满足正则表达式中的Unicode字母:" p {L}"...... 你错过了Windows的限制:不能以点或空格结束。 谢谢@MartinBonner,我添加了这些信息。我在Windows资源管理器和命令行中尝试过它,它只是修剪尾随空格或点 - 但是,不能保证一个人使用的编程语言总能安全地为你做到这一点 - 更不用说创建突然与名称不匹配的文件了你在申请中使用过的。 @mikerodent \p{L}是一个很好的开始,可以在一些正则表达式引擎中使用。但如果它以分解形式出现,它将不允许:重音不是一个字母。请参阅regular-expressions.info/unicode.html "你将在你的白名单中包含任何所需的unicode字符。通常可以很容易地指定字符范围" - 为任意(未提前知道)语言执行此操作将是非常重要的。在某些正则表达式引擎中,您可以使用类别(如\p{L}\p{M}*(regular-expressions.info/unicode.html)将任何字母与其变音符号一起列入白名单。但它不包括非罗马脚本中的数字,句点,连字符,下划线等。 "考虑到所有事情,在文件或目录名称上下文中有意义的字符范围很短。"也许对于一些用例。我正在研究一个现在涉及20种语言的媒体文件的项目,文件名需要反映媒体项目的标题,因为最终用户将以这种方式查找内容。许多名字都使用标点符号。对文件名字符的任何限制都有价格,所以在这种情况下我们必须尽量减少限制。在这个用例中,文件名中没有意义的字符范围比那些字符更短更简单。 @LarsH,如果您使用20种语言,我不希望您能够使用一个全能正则表达式。就个人而言,我会尝试创建一个基本文件名生成器,可以使用针对那些需要其他或不同规则的语言的特定规则来扩展它。通过这种方式,您可以获得全能,并且还可以处理语言细节。 如今,许多程序的一个现实是,您不知道客户将是谁,或者他们将使用哪种语言。例如,如果您在应用商店或Windows或Apple商店中发布给普通公众。默认情况下,您可以将您的软件设置为仅限英语(或仅限欧洲语言),这是一种常见方法......对于其他语言的发言人来说,搜索软件以满足他们的需求是令人沮丧的。它也可以是开发人员可避免的收入损失。设计程序在很大程度上与脚本无关,并不需要花费太多精力。

好吧,如果仅用于研究目的,那么最好的办法是查看文件名上的维基百科条目。

如果你想编写一个可移植的函数来验证用户输入并根据它创建文件名,那么简短的答案就是不这样做。看看像Perl的File :: Spec这样的便携式模块,可以一瞥完成这种"简单"任务所需的所有跳跃。

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

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

https://support.microsoft.com/en-us/kb/177506

对于Windows,您可以使用PowerShell进行检查

1$PathInvalidChars = [System.IO.Path]::GetInvalidPathChars() #36 chars

要显示UTF-8代码,您可以转换

123456$enc = [system.Text.Encoding]::UTF8 $PathInvalidChars | foreach { $enc.GetBytes($_) } $FileNameInvalidChars = [System.IO.Path]::GetInvalidFileNameChars() #41 chars $FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference

截至2017年4月18日,在本主题的答案中没有明显的黑色或白色字符和文件名列表 - 并且有很多回复。

我能提出的最好的建议是让用户为他喜欢的文件命名。当应用程序尝试保存文件时使用错误处理程序,捕获任何异常,假设文件名是责备(显然确保保存路径也正常),并提示用户输入新文件名。为了获得最佳效果,请将此检查过程置于循环中,直到用户正确或放弃为止。对我来说最好(至少在VBA)。

相关讨论 从技术角度来看,你的答案@FCastro是正确的。 然而,从用户体验的角度来看,这是一场噩梦 - 用户被迫一次又一次地玩"打字的东西而且会告诉你,如果你成功了"游戏。 我宁愿看到一条消息(警告样式)告诉用户他们已经输入了一个非法字符,稍后将被转换。 Christopher Oezbek在2015年提供了这样一个黑名单。

在Windows 10(2019)中,尝试键入以下字符时会被错误禁止:

A file name can't contain any of the following characters:

\ / : * ?" |

虽然唯一非法的Unix字符可能是/和NULL,但是应该包括对命令行解释的一些考虑。

例如,虽然在Unix中命名文件1>&2或2>&1可能是合法的,但在命令行上使用时,这样的文件名可能会被误解释。

类似地,可以命名文件$PATH,但是当尝试从命令行访问它时,shell会将$PATH转换为其变量值。

相关讨论 对于BASH中的文字,我发现在没有插值的情况下声明文字的最佳方法是$myvalueis,例如:$ echo hi > $2>&1,cat 2\>\&1"hi"

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

相关讨论 "不是答案......拒绝了 - 主持人审查了你的旗帜,但没有发现支持它的证据"。 你在开玩笑吧。 请更好的主持人。

在Unix shell中,您几乎可以引用单引号'中的每个字符。除单引号本身外,您无法表达控制字符,因为\未展开。可以从带引号的字符串中访问单引号本身,因为您可以使用单引号和双引号连接字符串,例如'I'"'"'m',可用于访问名为"I'm"的文件(此处也可以双引号)。

因此,您应该避免使用所有控制字符,因为它们很难进入shell。其余的仍然很有趣,特别是以破折号开头的文件,因为大多数命令都将这些作为选项读取,除非您之前有两个破折号--,或者您使用./指定它们,这也隐藏了起始-。

如果你想做得好,不要使用shell和典型命令使用的任何字符作为语法元素,有时候依赖于位置,例如你仍然可以使用-,但不能作为第一个字符;与.相同,只有当你的意思是它("隐藏文件")时才能将它用作第一个字符。当你的意思是,你的文件名是VT100转义序列;-),所以ls使输出变得麻烦。

相关讨论 问题不在于贝壳。

我有同样的需求,正在寻找推荐或标准参考,并遇到了这个线程。我目前在文件名和目录名中应避免使用的黑名单是:

123456789101112131415161718192021222324$CharactersInvalidForFileName = {    "pound" ->"#",    "left 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" ->"@" }; 相关讨论 你会介意评论列表中的@吗? 问题是哪些角色是非法的。列表中的大多数字符都是合法的。 字母b? 大声笑,我假设那是lank spaces的b ...好吧还是留下了一些......我重新命名了一张图片(),-.;[]^_~€???…???‰????‘’""?–—??????? &.jpg但不得不改回来因为它看起来很生气......



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3