Quais caracteres são inválidos para um nome de arquivo do MS-DOS?

16

Estou escrevendo um procedimento de E / S de nome de arquivo na linguagem assembly x86-16. São necessários oito caracteres (não preciso aceitar nomes de arquivos longos) do teclado e são impressos em um campo de entrada de texto na tela.

No momento, estou permitindo números, letras maiúsculas e minúsculas, sublinhados e hífens.

Gostaria de permitir todos os símbolos legais, mas não consigo encontrar uma lista oficial de caracteres proibidos. O senso comum me diz que as barras são ilegais, mas se eu tivesse que adivinhar, eu diria que o caractere mais é legal. (não é!)

Eu já estou ignorando o caractere de ponto, pois meu código lida automaticamente com o acréscimo do período e da extensão do arquivo.

    
por My life is a bug. 28.09.2018 / 06:06

4 respostas

29
Um resumo conciso pode ser encontrado na Wikipedia:

Legal characters for DOS filenames include the following:

  • Upper case letters AZ
  • Numbers 09
  • Space (though trailing spaces in either the base name or the extension are considered to be padding and not a part of the filename, also filenames with spaces in them must be enclosed in quotes to be used on a DOS command line, and if the DOS command is built programmatically, the filename must be enclosed in quadruple quotes when viewed as a variable within the program building the DOS command.)
  • ! # $ % & ' ( ) - @ ^ _ ' { } ~
  • Values 128–255 (though if NLS services are active in DOS, some characters interpreted as lowercase are invalid and unavailable)

This excludes the following ASCII characters:

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows/MS-DOS has no shell escape character
  • . (U+002E . full stop) within name and extension fields, except in . and .. entries (see below)
  • Lower case letters az (stored as A–Z on FAT12/FAT16)
  • Control characters 0–31
  • Value 127 (DEL)[dubious – discuss]

link

E aqui está o guia do usuário do MS-DOS 6 oficialmente dito

Naming Files and Directories

Every file and directory, except for the root directory on each drive, must have a name. The following list summarizes the rules for naming files and directories. File and directory names:

  • Can be up to eight characters long. In addition, you can include an extension up to three characters long.
  • Are not case-sensitive. It does not matter whether you use uppercase or lowercase letters when you type them.
  • Can contain only the letters A through Z, the numbers 0 through 9, and the following special characters: underscore (_), caret (^), dollar sign ($), tilde (~), exclamation point (!), number sign (#), percent sign (%), ampersand (&), hyphen (-), braces ({}), at sign (@), single quotation mark ('), apostrophe ('), and parentheses (). No other special characters are acceptable.
  • Cannot contain spaces, commas, backslashes, or periods (except the period that separates the name from the extension).
  • Cannot be identical to the name of another file or subdirectory in the same directory.

Isso é do PC-DOS 7:

The name you assign to a file must meet the following criteria:

  • It can contain no more than eight characters.
  • It can consist of the letters A through Z, the numbers 0 through 9, and the following special characters:

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

Note: No other special characters are acceptable.

  • The name cannot contain spaces, commas, backslashes, or periods (except the period that separates the name from the extension).
  • The name cannot be one of the following reserved file names: CLOCK$, CON, AUX, COM1, COM2, COM3, COM4, LPT1, LPT2, LPT3, LPT4, NUL, and PRN.
  • It cannot be the same name as another file within the directory.

Guia do usuário - PC DOS 7

The first byte of a name must not be 0x20 (space). Short names or extensions are padded with spaces. Special ASCII characters 0x22 ("), 0x2a (*), 0x2b (+), 0x2c (,), 0x2e (.), 0x2f (/), 0x3a (:), 0x3b (;), 0x3c (<), 0x3d (=), 0x3e (>), 0x3f (?), 0x5b ([), 0x5c (\), 0x5d (]), 0x7c (|) are not allowed.

O sistema de arquivos FAT

Se você também estiver interessado no MS-DOS 5.0, então aqui está .

    
por 28.09.2018 / 06:39
12

Estritamente falando, como programador de aplicativos MS / PC / DR-DOS, você deve perguntar ao sistema operacional por esta informação. INT 0x21 com AX = 0x6505 retorna um ponteiro para a tabela chamada FCHAR NLS para seu país e página de código. Esta tabela lista um intervalo de caracteres e um outro conjunto de caracteres que terminam nomes de arquivos.

Em teoria, varia de acordo com o país e a página de códigos. Mas o fato de que ele não foi formalmente transferido para a API do OS / 2 Control Program e o fato de que O FreeDOS tem 1 tabela em todas as páginas de código e os países mostram que é amplamente invariável na prática.

Leitura adicional

por 28.09.2018 / 12:31
10

Eu encontrei isso em um manual para o MS-DOS 3.3. Estou executando 6.22, mas provavelmente ainda se aplica. Eu estava errado sobre '+' ser permitido.

    
por 28.09.2018 / 06:19
3

Se você quiser apenas validar o nome do arquivo, convém usar INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH) depois de garantir que o nome do arquivo transmitido não possui dois pontos ou barras invertidas (podem ser tratados como letras de unidade e diretórios): a função pega o nome do arquivo proposto e tenta canonizá-lo colocando letras maiúsculas e caracteres inválidos (também adiciona uma unidade nome da carta / servidor e caminho.)

No pseudocódigo:

If !(filename contains {"/", "\", ".", ":"})
    Canonicalize filename (INT 21H/AH=60H)
    If !(CF is set) filename is valid
Filename is not valid
    
por 29.09.2018 / 02:59