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

2024-03-29 10:09:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我还缺什么?

不过,我需要一个全面的指导,而且要考虑到 双字节字符。与外部资源联系对我来说很好。

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


Tags: 文件目录名称内容字节linuxwindows资源
3条回答

一本“综合指南”中禁止的文件名字符在Windows上不起作用,因为它保留文件名和字符。是的,像 *"?和其他名称是被禁止的,但是有无限多的名称只由被禁止的有效字符组成。例如,空格和圆点是有效的文件名字符,但禁止仅由这些字符组成的名称。

Windows不区分大写和小写字符,因此如果名为a的文件夹已经存在,则不能创建名为A的文件夹。更糟糕的是,像PRNCON这样看似允许的名称,以及许多其他名称,都是保留的,是不允许的。Windows也有一些长度限制;如果将一个文件夹中有效的文件名移到另一个文件夹中,则该文件名可能无效。规则 naming files and folders 在MSDN上。

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

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

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

  1. 禁止的可打印ASCII字符有:

    • Linux/Unix系统:

      / (forward slash)
      
    • 窗口:

      < (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)
      
  2. 不可打印字符

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

    • Linux/Unix系统:

      0 (NULL byte)
      
    • 窗口:

      0-31 (ASCII control characters)
      

    注意:在Linux/Unix文件系统下,创建文件名中带有控制字符的文件是合法的,it might be a nightmare for the users to deal with such files

  3. 保留文件名

    保留以下文件名:

    • 窗口:

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

      (它们本身和任意文件扩展名,例如LPT1.txt)。

  4. 其他规则

    • 窗口:

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

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

据传Steven Bourne(属于shell)有一个包含254个文件的目录,每个文件名(当然,不包括/'\0';名称.是当前目录)中的字母(字符代码)对应一个目录。它被用来测试Bourne shell,并经常对备份程序等不小心的程序造成破坏。

其他人已经遵守了Windows规则。

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


1在第6章,测试,§6.5压力测试中,Kernighan&Pike在The Practice of Programming中也这么说:

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个文件。这并不影响轶事的有效性,也不影响它所描述的仔细测试。

相关问题 更多 >