当前位置: 首页 > 面试题库 >

文件名中不允许使用什么字符序列?

滕祯
2023-03-14
问题内容

经过测试,我发现linux允许文件名中的任何字符/(和和null(\0)除外)。那么我不应该以什么顺序输入文件名呢?我听说领导-可能会混淆某些命令行程序,这对我来说并不重要,但是如果其他人决定收集一堆文件并使用某些GNU程序对其进行过滤,则可能会打扰其他人。

我建议删除前导空格和尾随空格,而我计划这样做的原因仅是因为用户通常并不打算拥有前导/尾随空格。

可能会有什么问题序列,我应该考虑不允许什么序列?我还考虑为了方便起见,不允许在Windows中使用非法字符。我想我可能一开始不允许使用破折号(破折号是合法的窗口字符)


问题答案:

自从您详细讨论了Linux以来,您的问题有些令人困惑,但随后在对另一个答案的评论中,您说您正在生成供人们下载的文件名,这大概意味着您绝对无法控制要使用的文件系统和操作系统。文件将存储在Linux上完全不相关。

出于此答案的目的,我将假设您的问题是错误的,并且您的评论是正确的。

当前使用的绝大多数操作系统和文件系统大致可分为三类:POSIX,Windows和MacOS。

POSIX规范对于保证在 所有
POSIX系统之间可移植的文件名是什么样子非常明确。您可以使用的字符在开放组基本规范的3.276节(便携式文件名字符集)中定义为:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 ._-

您可以依赖的最大文件名长度在第13.23.3.5节(<limits.h>最小值)中定义为14。(相关常数是_POSIX_NAME_MAX。)

因此,文件名最长为14个字符,并且仅包含上面列出的65个字符,可以在所有POSIX兼容系统上安全使用,这可以为您提供24407335764928225040435790组合(或大约84位)。

如果您不想惹恼用户,则应增加两个限制:不要以破折号或点开头。以点开头的文件名通常被解释为“隐藏”文件,除非明确要求,否则不会显示在目录列表中。并且以短划线开头的文件名可能被许多命令解释为选项。(旁注:令人惊讶的是,有多少用户不了解rm ./-rfrm -- -rf技巧。)

这使您处于23656340818315048885345458组合(仍为84位)。

Windows为此添加了两个新的限制:文件名不能以点结尾,并且文件名不区分大小写。这样会将字符集从65个减少到39个字符(第一个字符为37个,最后一个字符为38个)。它没有增加任何长度限制,Windows可以处理14个字符。

这将可能的组合减少到17866587696996781449603(73位)。

另一个限制是Windows将最后一个点之后的所有内容都视为文件扩展名,表示文件的类型。如果要避免潜在的混乱(例如,如果生成的文件名类似于abc.mp3文本文件),则应该完全避免点。

您仍然有13090925539866773438463组合(73位)。

如果您要担心DOS,则存在其他限制:文件名由一个或两个部分(由点分隔)组成,其中两个部分都不能包含点。第一部分的最大长度为8,第二部分为3个字符。同样,第二部分通常保留以指示文件类型,仅剩下8个字符。

现在您有4347792138495个可能的文件名或41位。

消息是,您可以使用3个字符的扩展名实际 正确地 指示文件类型,而不会破坏POSIX文件名的限制(8 + 3 + 1 = 12 <14)。

如果希望用户能够将文件刻录到以ISO9660级别1格式化的CD-R上,则必须在任何地方都禁止连字符,而不仅仅是第一个字符。现在,剩下的字符集看起来像

ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789_

即可获得3512479453921组合(41位)。



 类似资料:
  • 问题内容: 我一直想知道为什么我们不能在python中的函数名和变量名之间使用连字符 尝试过使用Lisp和Clojure之类的功能编程语言,允许使用连字符。为什么python不这样做。 我确信,由于某些原因,圭多爵士一定会这样做。我用谷歌搜索,但找不到答案。谁能给我一点启示吗? 问题答案: 因为连字符用作减法运算符。想象一下,您 可以 拥有一个函数,然后拥有如下代码: 是对函数的调用,还是从名为的

  • 问题内容: 我用来解析/验证用户输入。不幸的是,它在解析时允许字符作为后缀。 示例代码: 结果: 我实际上希望他们两个都有解析异常。我怎样才能告诉我不允许输入? 问题答案: 从以下文档中: 从给定字符串的开头解析文本以产生数字。 该方法可能不会使用给定字符串的整个文本。 这是一个示例,可以使您了解如何确保考虑整个字符串。 输出:

  • 问题内容: 我使用的是PHP,而MySQL使用的是PDO。有时我需要准备一个在此查询中多次使用一个变量(占位符)的语句。 例: 但是,如果我尝试准备该语句,则会出现错误,因此我需要采用以下方式: 要调用此语句,我将需要具有以下数组: 对我来说真是太蠢了!为什么MySQL(PDO?)不允许我多次使用一个占位符,并迫使我使用需要更多控制权的额外变量? 如果查询相对简单(如我在上面发布的内容),则可以轻

  • 问题内容: 在精确地探究Java标识符中允许使用哪些字符时,我偶然发现了一件非常奇怪的事情,以至于几乎可以肯定这是一个错误。 我预料地发现,Java标识符合他们开始与拥有的Unicode字符属性的要求,并其次是与物业,以授予领先的下划线和美元符号例外。事实并非如此,我发现与我所听说的那种普通标识符或其他任何想法都存在极大差异。 简短演示 请考虑以下演示,证明Java标识符中允许使用ASCII ES

  • 问题内容: 在HTML属性 名称=值 对中,“名称”部分允许使用哪些字符?.....看一些常见的属性,似乎只使用字母(az和AZ),但还可以允许其他字符吗?…也许是数字(0-9),连字符(-)和句点(。)…对此有任何规范吗? 问题答案: 这取决于“允许”的含义。每个标签都有一个固定的有效属性名称列表,在html中,它们不区分大小写。在一个重要的意义上,仅允许以正确的顺序排列这些字符。 另一种查看方

  • 问题内容: Linux环境变量名称中允许使用哪些字符?我对手册页和网络的粗略搜索只产生了有关如何使用变量的信息,但没有产生允许使用的名称。 我有一个Java程序,它需要一个包含点的已定义环境变量,例如。使用Windows,我可以设置该变量,但是我没有在Linux中设置它的运气(在SuSE和Ubuntu中尝试过)。甚至允许使用该变量名吗? 问题答案: 来自公开组: 这些字符串的格式为name = v