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


16

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

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

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

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


17
您可能还会发现Retrocomputing有用。
鲍勃

尝试在Windows中创建一个文件夹并放入“?” 在名字里。工具提示会告诉您禁止使用哪些字符。这为您提供了一个开始:)...
Mixxiphoid

@Mixxiphoid无法使用,因为Windows中允许的字符集要大得多。例如+,;[]a-zWindows中允许使用空格和,但DOS不允许使用。资源管理器给我一个错误“文件名不能包含以下任何字符\ / : * ? " < > |,而这些字符只是DOS中禁止的字符的子集
phuclv

1
@phuclv就是为什么我说“这为您提供了一个起点”,也是为什么这是评论而不是答案。
Mixxiphoid

为什么所有的MS-DOS符号?为什么不同时考虑其他较旧的OS规则?
jpmc26

Answers:


30

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

DOS文件名的合法字符包括以下内容:

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

这不包括以下ASCII字符:

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

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

这是MS-DOS 6用户指南的正式声明

命名文件和目录

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

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

这是从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
    

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

  • 该名称不能包含空格,逗号,反斜杠或句点(将名称与扩展名分隔的句点除外)。
  • 该名称不能是以下保留文件名之一: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感兴趣,那么这里是


11
这可能是值得指出的是,即使它们只包含合法的字符的特殊文件名CONPRNAUXNULCOM1COM2COM3COM4COM5COM6COM7COM8COM9LPT1LPT2LPT3LPT4LPT5LPT6LPT7LPT8,并且LPT9也不允许(见这里
托马斯Schremser

3
@ThomasSchremser“请勿使用”,“避免”和“不推荐”与“不允许”相同。
RobIII

1
@RobIII是,但是它们链接到“ Windows>桌面”文档,而不链接到“ MS-DOS”文档。DOSWiki说:“ DOS中有保留的设备名称,无论它们的扩展名如何,它们都不能用作文件名,因为它们被内置的字符设备占用。” 换句话说,在DOS和某些版本的Windows中是不允许的,在其他Windows版本中则不建议这样做。
量子

有趣的是,`被称为单引号。我一直听说它叫反引号,而'(他们称呼(不是错误地)为撇号)是单引号。
ale10ander

2
@ ale10ander是的,让我惊讶。我一直讨厌很多人将它用于撇号(例如在I`m中)或引号的开头部分。例如,GNU文档总是写“ like this”,这对我来说非常丑陋且
难以理解

12

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

理论上,它因国家和代码页而异。但是,它没有被正式带入OS / 2控制程序API中,而且FreeDOS在所有代码页和国家/地区中都有1个表这一事实表明,它实际上在很大程度上是不变的。

进一步阅读


10

我在MS-DOS 3.3的手册中找到了这一点。我正在运行6.22,但它可能仍然适用。我对允许使用“ +”是错误的。

在此处输入图片说明


2
当今的手册比Wikipedia更可靠
Stewart

@Stewart重要的是Wikipedia上的引号,而不是Wikipedia本身。如果有疑问,请检查文章\ @Mylifeisabug中的脚注和引用。我刚刚添加了MS-DOS 6手册
phuclv

3

如果只想验证文件名,则可能要INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH)在确保所传递的文件名没有冒号或反斜杠(可以将其视为驱动器字母和目录)后使用:该函数将采用您建议的文件名并尝试规范化通过大写字母并检查无效字符来完成此操作(它还会添加驱动器号/服务器名称和路径。)

用伪代码:

If !(filename contains {"/", "\", ".", ":"})
    Canonicalize filename (INT 21H/AH=60H)
    If !(CF is set) filename is valid
Filename is not valid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.