我正在用 x86-16 汇编语言编写一个文件名 I/O 过程。它从键盘获取八个字符(我不需要支持长文件名)并将它们打印到屏幕上的文本输入字段。
目前我允许使用数字、大写/小写字母、下划线和连字符。
我想允许使用所有合法符号,但我找不到禁用字符的官方列表。常识告诉我斜线是非法的,但如果我不得不猜测,我会说加号是合法的。(编辑:它不是!)
我已经忽略了句点字符,因为我的代码会自动处理附加句点和文件扩展名。
答案1
可以找到一个简明摘要在维基百科上:
DOS 文件名的合法字符包括以下内容:
- 大写字母
A
-Z
- 数字
0
–9
- 空格(虽然基本名称或扩展名中的尾随空格被视为填充而不是文件名的一部分,但是带有空格的文件名必须括在引号中才能在 DOS 命令行上使用,并且如果 DOS 命令是以编程方式构建的,则当在构建 DOS 命令的程序中将文件名视为变量时,必须用四重引号括起来。)
! # $ % & ' ( ) - @ ^ _ ` { } ~
- 值 128–255(但如果 NLS 服务在 DOS 中处于活动状态,则某些解释为小写的字符将无效且不可用)
这不包括以下 ASCII 字符:
" * + , / : ; < = > ? \ [ ] |
[9]- Windows/MS-DOS 没有 shell 转义字符
.
(U+002E . 句号)在名称和扩展字段内,但 . 和 .. 条目除外(见下文)- 小写字母
a
-z
(在 FAT12/FAT16 上存储为 A–Z)- 控制字符 0–31
- 值 127 (DEL)[可疑 - 讨论]
https://en.wikipedia.org/wiki/8.3_filename#Directory_table
以下是 MS-DOS 6 用户指南的官方说明
命名文件和目录
每个文件和目录(每个驱动器上的根目录除外)都必须有一个名称。以下列表总结了文件和目录的命名规则。文件和目录名称:
- 最多可以包含 8 个字符。此外,还可以包含最多 3 个字符的扩展名。
- 不区分大小写。输入时使用大写或小写字母都没有关系。
- 只能包含字母 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
注意:不接受其他特殊字符。
- 名称不能包含空格、逗号、反斜杠或句点(除了将名称与扩展名分隔的句点)。
- 该名称不能是以下保留文件名之一:CLOCK$、CON、AUX、COM1、COM2、COM3、COM4、LPT1、LPT2、LPT3、LPT4、NUL 和 PRN。
- 它不能与目录中的另一个文件同名。
名称的第一个字节不能是 0x20(空格)。短名称或扩展名用空格填充。不允许使用特殊 ASCII 字符 0x22 (
"
)、0x2a (*
)、0x2b (+
)、0x2c (,
)、0x2e (.
)、0x2f (/
)、0x3a:
(;
)、0x3b (<
)、0x3c (=
)、0x3d ( )、0x3e (>
)、0x3f (?
)、0x5b[
( )、0x5c\
( )、0x5d (]
)、0x7c (|
)。
如果你也对 MS-DOS 5.0 感兴趣,那么这里是。
答案2
严格来说,作为 MS/PC/DR-DOS 应用程序程序员,您应该向操作系统询问此信息。INT 0x21 和 AX=0x6505 返回指向FCHAR
您所在国家/地区和代码页的所谓 NLS 表的指针。此表列出了一系列字符和一组终止文件名的字符。
理论上,它因国家和代码页而异。但事实上,它没有正式被带入 OS/2 控制程序 API,而且FreeDOS 有 1 个涵盖所有代码页和国家/地区的表格表明它在实践中基本上是不变的。
进一步阅读
答案3
答案4
如果你只是想验证文件名,你可能需要使用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