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. Ele pega oito caracteres (não preciso suportar nomes de arquivos longos) do teclado e os imprime em um campo de entrada de texto na tela.

No momento, estou permitindo números, letras maiúsculas / 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, diria que o caractere positivo é legal. (editar: não é!)

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


17
Você também pode achar a Retrocomputação útil.
Bob

Tente criar uma pasta no Windows e coloque um '?' no nome. Uma dica de ferramenta informa quais caracteres são proibidos. Isso dá-lhe um começo
:)

@ Mixxiphoid que não funcionará porque o conjunto de caracteres permitidos no Windows é muito maior. Por exemplo +,;[], espaço e a-zsão permitidos no Windows, mas não no DOS. Explorador me dá o erro "Um nome de arquivo não pode conter nenhum dos seguintes caracteres \ / : * ? " < > |, que é apenas um subconjunto dos caracteres proibidos em DOS
phuclv

11
@phuclv foi por isso que eu disse 'Isso dá um começo' e também porque esse é um comentário e não uma resposta.
Mixxiphoid

Por que todos os símbolos do MS-DOS? Por que não considerar também outras regras mais antigas do sistema operacional?
precisa saber é

Respostas:


30

Um resumo conciso pode ser encontrado na Wikipedia :

Os caracteres legais para nomes de arquivos do DOS incluem o seguinte:

  • Letras maiúsculas A-Z
  • Números 0-9
  • Espaço (embora os espaços à direita no nome base ou na extensão sejam considerados como preenchimento e não faça parte do nome do arquivo, também os nomes de arquivos com espaços devem ser colocados entre aspas para serem usados ​​em uma linha de comando do DOS e, se o DOS O comando é criado programaticamente, o nome do arquivo deve ser colocado entre aspas quádruplas quando exibido como uma variável no programa que cria o comando DOS.)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • Valores 128–255 (embora se os serviços NLS estiverem ativos no DOS, alguns caracteres interpretados como minúsculos são inválidos e indisponíveis)

Isso exclui os seguintes caracteres ASCII:

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows / MS-DOS não possui caractere de escape de shell
  • .(U + 002E. Ponto final) nos campos de nome e extensão, exceto em. e .. entradas (veja abaixo)
  • Letras minúsculas a- z(armazenadas como A – Z no FAT12 / FAT16)
  • Caracteres de controle de 0 a 31
  • Valor 127 (DEL) [duvidoso - discutir]

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

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

Nomeando arquivos e diretórios

Todo arquivo e diretório, exceto o diretório raiz em cada unidade, deve ter um nome. A lista a seguir resume as regras para nomear arquivos e diretórios. Nomes de arquivos e diretórios:

  • Pode ter até oito caracteres. Além disso, você pode incluir uma extensão com até três caracteres.
  • Não diferenciam maiúsculas de minúsculas. Não importa se você usa letras maiúsculas ou minúsculas ao digitá-las.
  • Pode conter apenas as letras de A a Z, os números de 0 a 9 e os seguintes caracteres especiais: sublinhado ( _), ^sinal de intercalação ( ), cifrão ( $), til ( ~), ponto de exclamação ( !), sinal de número ( #), sinal de porcentagem ( ) ( %), e comercial ( &), hífen ( -), chaves ( {}), sinal de trânsito ( @), aspas simples ( `), apóstrofo ( ') e parênteses (). Nenhum outro caractere especial é aceitável.
  • Não pode conter espaços, vírgulas, barras invertidas ou pontos (exceto o período que separa o nome da extensão).
  • Não pode ser idêntico ao nome de outro arquivo ou subdiretório no mesmo diretório.

Isto é do PC-DOS 7:

O nome que você atribui a um arquivo deve atender aos seguintes critérios:

  • Ele pode conter não mais que oito caracteres.
  • Pode consistir nas letras A a Z, nos números de 0 a 9 e nos seguintes caracteres especiais:

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

Nota: Nenhum outro caractere especial é aceitável.

  • O nome não pode conter espaços, vírgulas, barras invertidas ou pontos (exceto o período que separa o nome da extensão).
  • O nome não pode ser um dos seguintes nomes de arquivos reservados: CLOCK $, CON, AUX, COM1, COM2, COM3, COM4, ​​LPT1, LPT2, LPT2, LPT3, LPT4, NUL e PRN.
  • Não pode ser o mesmo nome que outro arquivo dentro do diretório.

Guia do Usuário - PC DOS 7

O primeiro byte de um nome não deve ser 0x20 (espaço). Nomes curtos ou extensões são preenchidos com espaços. Caracteres ASCII especiais 0x22 ( "), 0x2a ( *), 0x2b ( +), 0x2c ( ,), 0x2e ( .), 0x2f ( /), 0x3a ( :), 0x3b ( ;), 0x3c ( <), 0x3d ( =), 0x3e ( >), 0x3f ( ?) , 0x5b ( [), 0x5c ( \), 0x5d ( ]), 0x7c ( |) não são permitidos.

O sistema de arquivos FAT

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


11
Pode ser interessante notar que mesmo que eles contêm apenas caracteres válidos os nomes de arquivos especiais CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, e LPT9também não são permitidas (ver aqui )
Thomas Schremser

3
@ThomasSchremser "Não use", "Evitar" e "Não recomendado" não é o mesmo que "não permitido".
RobIII

11
@RobIII Sim, mas eles vincularam à documentação "Windows> Desktop", não à documentação "MS-DOS". O wiki do DOS diz: "Existem nomes de dispositivos reservados no DOS que não podem ser usados ​​como nomes de arquivos, independentemente da extensão, pois são ocupados por dispositivos de caracteres internos". Em outras palavras, não é permitido no DOS e em algumas versões do Windows e não é recomendado em outras versões do Windows.
Quantic 28/09

É interessante que o `seja chamado de aspas simples. Eu sempre ouvi isso chamar de backtick, e o '(o que eles chamam (não incorretamente) de apóstrofo) como uma única citação.
ale10ander

2
@ ale10ander sim que me surpreendeu. Eu sempre odiei que muitas pessoas o usassem para o apóstrofo (como eu sou) ou para a parte inicial da citação. Por exemplo, as documentações do GNU sempre escrevem `assim ', que é muito feio e menos legível para mim
phuclv

12

A rigor, como programador de aplicativos MS / PC / DR-DOS, você deve solicitar essas informações ao sistema operacional. INT 0x21 com AX = 0x6505 retorna um ponteiro para a chamada FCHARtabela NLS do seu país e página de código. Esta tabela lista um intervalo de caracteres e um conjunto adicional de caracteres que encerram nomes de arquivos.

Em teoria, isso varia de acordo com o país e a página de códigos. Mas o fato de não ter sido formalmente transferido para a API do Programa de Controle OS / 2 e o fato de o FreeDOS ter uma tabela em todos os países e páginas de código mostram que na prática é bastante invariável.

Leitura adicional


10

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

Digite a descrição da imagem aqui


2
Um manual de back-in-the-dia é mais confiável do que Wikipedia
Stewart

@ Stewart O que é importante são as citações na Wikipedia, não a própria Wikipedia. Em caso de dúvida basta verificar as notas de rodapé e referências no artigo \ @Mylifeisabug I acabou de adicionar o MS-DOS 6 manual de
phuclv

3

Se você apenas deseja validar o nome do arquivo, pode querer usá-lo INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH)depois de garantir que o nome do arquivo passado não tenha dois pontos ou barra invertida (esses podem ser tratados como letras e diretórios de unidade): a função pega o nome do arquivo proposto e tenta canonizar coloque as letras em maiúsculas e verifique se há caracteres inválidos (também adiciona um nome e caminho da letra da unidade / servidor).

No pseudocódigo:

If !(filename contains {"/", "\", ".", ":"})
    Canonicalize filename (INT 21H/AH=60H)
    If !(CF is set) filename is valid
Filename is not valid
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.