哪些字符对于 MS-DOS 文件名无效?

My *_*ug. 17 ms-dos data-validation filenames

我正在用 x86-16 汇编语言编写文件名 I/O 过程。它需要从键盘输入八个字符(我不需要支持长文件名)并将它们打印到屏幕上的文本输入字段。

目前我允许使用数字、大写/小写字母、下划线和连字符。

我想允许所有合法符号,但我找不到禁止字符的官方列表。常识告诉我斜线是非法的,但如果我不得不猜测,我会说加号是合法的。(编辑:它不是!)

我已经忽略了句点字符,因为我的代码会自动处理附加句点和文件扩展名。

phu*_*clv 32

可以在 Wikipedia上找到简明摘要:

DOS 文件名的合法字符包括:

  • 大写字母AZ
  • 数字0——9
  • 空格(尽管基本名称或扩展名中的尾随空格被认为是填充而不是文件名的一部分,但其中包含空格的文件名也必须用引号括起来才能在 DOS 命令行上使用,如果 DOS命令以编程方式构建,当在构建 DOS 命令的程序中将文件名视为变量时,文件名必须用四引号括起来。)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • 值 128–255(尽管如果 NLS 服务在 DOS 中处于活动状态,某些解释为小写的字符将无效且不可用)

这不包括以下 ASCII 字符:

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows/MS-DOS 没有外壳转义字符
  • .(U+002E . 句号) 在名称和扩展字段中,除了 . 和 .. 条目(见下文)
  • 小写字母az(在 FAT12/FAT16 上存储为 A-Z)
  • 控制字符 0–31
  • 值 127 (DEL)[可疑 - 讨论]

https://en.wikipedia.org/wiki/8.3_filename#Directory_table

这是 MS-DOS 6 用户指南官方所说的

命名文件和目录

除了每个驱动器上的根目录外,每个文件和目录都必须有一个名称。以下列表总结了命名文件和目录的规则。文件名和目录名:

  • 最长可达八个字符。此外,您可以包含最多三个字符的扩展名。
  • 不区分大小写。键入时使用大写字母还是小写字母都没有关系。
  • 只能包含字母 A 到 Z、数字 0 到 9 以及以下特殊字符:下划线 ( _)、脱字符 ( ^)、美元符号 ( $)、波浪号 ( ~)、感叹号 ( !)、数字符号 ( #)、百分号( %)、与号 ( &)、连字符 ( -)、大括号 ( {})、at 符号 ( @)、单引号 ( `)、撇号 ( ') 和括号()。不接受其他特殊字符。
  • 不能包含空格、逗号、反斜杠或句点(分隔名称与扩展名的句点除外)。
  • 不能与同一目录中的另一个文件或子目录的名称相同。

这是来自 PC-DOS 7:

您分配给文件的名称必须满足以下条件:

  • 它最多可以包含八个字符。
  • 它可以由字母 A 到 Z、数字 0 到 9 以及以下特殊字符组成:

    _ underscore            ^  caret
    $ dollar sign           ~  tilde
    ! exclamation point     #  number sign
    % percent sign          &  ampersand
    - hyphen                {} braces
    @ at sign               `  single quote
    ' apostrophe            () parentheses
    
    Run Code Online (Sandbox Code Playgroud)

注意:不接受其他特殊字符。

  • 名称不能包含空格、逗号、反斜杠或句点(分隔名称与扩展名的句点除外)。
  • 该名称不能是以下保留文件名之一:CLOCK$、CON、AUX、COM1、COM2、COM3、COM4、LPT1、LPT2、LPT3、LPT4、NUL 和 PRN。
  • 它不能与目录中的另一个文件同名。

用户指南 - PC DOS 7

名称的第一个字节不能是 0x20(空格)。短名称或扩展名用空格填充。特殊的ASCII字符为0x22( "),0x2a(),0x2B*访问(+),0x2c上(,),器0x2E( .),值为0x2F( /),0x3a(),0x3b(: ;),为0x3C( <),0x3D之间(=),0x3E的(>),0x3F的(?) , 0x5b ( [), 0x5c ( \), 0x5d ( ]), 0x7c ( |) 是不允许的。

FAT文件系统

如果您也对 MS-DOS 5.0 感兴趣,那么这里是.

  • 值得注意的是,即使它们只包含有效字符,特殊文件名 `CON`、`PRN`、`AUX`、`NUL`、`COM1`、`COM2`、`COM3`、`COM4`、`COM5 `、`COM6`、`COM7`、`COM8`、`COM9`、`LPT1`、`LPT2`、`LPT3`、`LPT4`、`LPT5`、`LPT6`、`LPT7`、`LPT8`、和 `LPT9` 也是不允许的(参见 [此处](https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file)) (11认同)
  • @ThomasSchremser “请勿使用”、“避免”和“不推荐”与“不允许”不同。 (3认同)
  • @ale10ander 是的,这让我感到惊讶。我一直讨厌很多人将它用作撇号(如在 I\`m 中)或引用的开头部分。例如,GNU 文档总是写“像这样”,这对我来说非常难看且可读性较差 (2认同)

Jde*_*eBP 13

严格来说,作为 MS/PC/DR-DOS 应用程序程序员,您应该向操作系统询问这些信息。带有 AX=0x6505 的 INT 0x21 返回一个指向FCHAR您所在国家/地区和代码页的所谓NLS 表的指针。该表列出了一系列字符和另一组终止文件名的字符。

理论上它因国家和代码页而异。但事实上,它没有被正式转移到 OS/2 控制程序 API 中,以及FreeDOS 在所有代码页和国家/地区都有 1 个表的事实表明它在实践中基本上是不变的。

进一步阅读


My *_*ug. 10

我在 MS-DOS 3.3 的手册中找到了这个。我正在运行 6.22,但它可能仍然适用。我错了'+'被允许。

在此处输入图片说明

  • 过去的手册比维基百科更可靠 (2认同)