Eu sei que / é ilegal no Linux, e o seguinte é ilegal no Windows (eu acho) *
.
"
/
\
[
]
:
;
|
,
O que mais estou perdendo?
No entanto, preciso de um guia abrangente e que leve em consideração caracteres de byte duplo. Vincular a recursos externos está bem comigo.
Preciso primeiro criar um diretório no sistema de arquivos usando um nome que possa conter caracteres proibidos, por isso pretendo substituir esses caracteres por sublinhados. Preciso gravar esse diretório e seu conteúdo em um arquivo zip (usando Java), para que qualquer conselho adicional sobre os nomes dos diretórios zip seja apreciado.
echo abc > "ab.;,=[1]"
Respostas:
Um “guia abrangente” de caracteres proibidos de nome de arquivo não funcionará no Windows porque reserva nomes de arquivos e caracteres. Sim, caracteres como
*
"
?
e outros são proibidos, mas há um número infinito de nomes compostos apenas por caracteres válidos que são proibidos. Por exemplo, espaços e pontos são caracteres válidos para o nome do arquivo, mas nomes compostos apenas por esses caracteres são proibidos.O Windows não faz distinção entre caracteres maiúsculos e minúsculos; portanto, você não pode criar uma pasta chamada
A
se umaa
já existir. Pior, nomes aparentemente permitidos comoPRN
eCON
, e muitos outros, são reservados e não são permitidos. O Windows também possui várias restrições de comprimento; um nome de arquivo válido em uma pasta pode se tornar inválido se movido para outra pasta. As regras para nomear arquivos e pastas estão nos documentos da Microsoft.Em geral, você não pode usar texto gerado pelo usuário para criar nomes de diretório do Windows. Se você quiser permitir que os usuários para citar qualquer coisa que eles querem, você tem que criar nomes seguros, como
A
,AB
,A2
et al., Armazenar nomes gerados pelo usuário e seus equivalentes de caminho em um arquivo de dados do aplicativo e executar o mapeamento caminho em sua aplicação.Se você absolutamente deve permitir nomes de pastas gerados pelo usuário, a única maneira de saber se eles são inválidos é capturar exceções e assumir que o nome é inválido. Mesmo isso é repleto de perigos, já que as exceções lançadas para acesso negado, unidades offline e espaço fora da unidade se sobrepõem àquelas que podem ser lançadas para nomes inválidos. Você está abrindo uma enorme lata de mágoa.
fonte
A.txt
era inválida porquea.TXT
podem existir.COPY CON PRN
significa ler da entrada do teclado ou possível stdin e copiá-lo para o dispositivo da impressora. Não tenho certeza de que ainda é válido em janelas modernas, mas certamente foi por muito tempo. Antigamente, você poderia usá-lo para digitar texto e fazer com que uma impressora matricial simplesmente a produzisse.Vamos simplificar e responder à pergunta primeiro.
Os caracteres ASCII imprimíveis proibidos são:
Linux / Unix:
Janelas:
Caracteres não imprimíveis
Se seus dados vierem de uma fonte que permitiria caracteres não imprimíveis, há mais a verificar.
Linux / Unix:
Janelas:
Nota: Embora seja legal nos sistemas de arquivos Linux / Unix criar arquivos com caracteres de controle no nome do arquivo, pode ser um pesadelo para os usuários lidar com esses arquivos .
Nomes de arquivos reservados
Os seguintes nomes de arquivos são reservados:
Janelas:
(por conta própria e com extensões de arquivo arbitrárias, por exemplo
LPT1.txt
).Outras regras
Janelas:
Os nomes de arquivos não podem terminar em um espaço ou ponto.
fonte
No Linux e outros sistemas relacionados ao Unix, existem apenas dois caracteres que não podem aparecer no nome de um arquivo ou diretório, e esses são NUL
'\0'
e barra'/'
. A barra, é claro, pode aparecer no nome de um caminho, separando os componentes do diretório.Rumor 1 diz que Steven Bourne (de 'shell' fama) teve um diretório contendo 254 arquivos, um para cada letra (código de caracteres) que pode aparecer em um nome de arquivo (excluindo
/
,'\0'
; o nome.
era o diretório atual, é claro ) Foi usado para testar o shell Bourne e causar estragos rotineiramente em programas incautos, como programas de backup.Outras pessoas cobriram as regras do Windows.
Observe que o MacOS X possui um sistema de arquivos que não diferencia maiúsculas de minúsculas.
1 Foi Kernighan & Pike em The Practice of Programming quem disse o mesmo no capítulo 6, testes, §6.5 testes de estresse:
Observe que o diretório deve ter entradas
.
e..
, portanto, eram 253 arquivos (e 2 diretórios) ou 255 entradas de nome, em vez de 254 arquivos. Isso não afeta a eficácia da anedota ou o teste cuidadoso que ela descreve.fonte
/
no nome. Isso causou alguns problemas, pois criou um novo diretório com o esquema.PATH
variável Unix , porque dois pontos serão usados como separador (ponto e vírgula no Windows). Portanto, os programas nesse diretório devem ser executados com um nome de caminho que especifique onde ele está (pode ser relativo ou absoluto) ou você deve estar no diretório e ter dot (.
, o diretório atual) emPATH
, o que é amplamente considerado como um inseguro.Em vez de criar uma lista negra de caracteres, você pode usar uma lista de permissões . Considerando tudo, o intervalo de caracteres que faz sentido em um contexto de nome de arquivo ou diretório é bastante curto e, a menos que você tenha alguns requisitos de nomenclatura muito específicos, seus usuários não o manterão contra o aplicativo se eles não puderem usar toda a tabela ASCII.
Ele não resolve o problema de nomes reservados no sistema de arquivos de destino, mas com uma lista de permissões é mais fácil mitigar os riscos na origem.
Nesse espírito, este é um conjunto de caracteres que podem ser considerados seguros:
E quaisquer caracteres seguros adicionais que você deseja permitir. Além disso, você apenas precisa aplicar algumas regras adicionais sobre espaços e pontos . Isso geralmente é suficiente:
Isso já permite nomes bastante complexos e sem sentido. Por exemplo, esses nomes seriam possíveis com essas regras e seriam nomes de arquivo válidos no Windows / Linux:
A...........ext
B -.- .ext
Em essência, mesmo com tão poucos caracteres na lista de permissões, você ainda deve decidir o que realmente faz sentido e validar / ajustar o nome de acordo. Em um dos meus aplicativos, usei as mesmas regras acima, mas retirei pontos e espaços duplicados.
fonte
A maneira mais fácil de obter o Windows para lhe responder é tentar renomear um arquivo via Explorer e digitar / para o novo nome. O Windows exibirá uma caixa de mensagem informando a lista de caracteres ilegais.
https://support.microsoft.com/en-us/kb/177506
fonte
Bem, mesmo que seja apenas para fins de pesquisa, sua melhor aposta é olhar para esta entrada da Wikipedia em Nomes de arquivos .
Se você deseja escrever uma função portátil para validar a entrada do usuário e criar nomes de arquivos com base nisso, a resposta curta é não . Dê uma olhada em um módulo portátil como o Perl's File :: Spec para dar uma olhada em todos os saltos necessários para realizar uma tarefa "simples".
fonte
Para Windows, você pode verificá-lo usando o PowerShell
Para exibir códigos UTF-8, você pode converter
fonte
No Windows 10 (2019), os seguintes caracteres são proibidos por um erro ao tentar digitá-los:
fonte
Aqui está uma implementação de ac # para Windows com base na resposta de Christopher Oezbek
Foi tornado mais complexo pelo booleano containsFolder, mas espero que cubra tudo
fonte
StringBuilder
com o valor da capacidade inicial? 2. Por que você adicionou 12 ao comprimento dafilename
? 3. Os 12 foram escolhidos arbitrariamente ou houve alguma reflexão por trás desse número?Desde 18/04/2017, nenhuma lista simples de caracteres em preto e branco e nomes de arquivos é evidente entre as respostas a este tópico - e há muitas respostas.
A melhor sugestão que pude sugerir foi deixar o nome do usuário no arquivo da maneira que ele preferir. Usando um manipulador de erros quando o aplicativo tenta salvar o arquivo, capturar quaisquer exceções, assumir que o nome do arquivo é o culpado (obviamente depois de garantir que o caminho para salvar também esteja correto) e solicitar ao usuário um novo nome de arquivo. Para obter melhores resultados, coloque esse procedimento de verificação em um loop que continua até que o usuário acerte ou desista. Funcionou melhor para mim (pelo menos no VBA).
fonte
Embora os únicos caracteres ilegais do Unix possam ser
/
eNULL
, embora algumas considerações para a interpretação da linha de comando devam ser incluídas.Por exemplo, embora possa ser legal nomear um arquivo
1>&2
ou2>&1
no Unix, nomes de arquivos como esse podem ser mal interpretados quando usados em uma linha de comando.Da mesma forma, pode ser possível nomear um arquivo
$PATH
, mas ao tentar acessá-lo na linha de comando, o shell será convertido$PATH
em seu valor variável.fonte
$'myvalueis'
, ex:$ echo 'hi' > $'2>&1'
,cat 2\>\&1
"oi"Dificuldades em definir, o que é legal e o que não é já foram abordadas e as listas de permissões foram sugeridas . Mas o Windows suporta caracteres com mais de 8 bits . A Wikipedia afirma que (por exemplo) o
Portanto, quero apresentar uma abordagem muito mais liberal usando caracteres Unicode para substituir os "ilegais". Eu achei o resultado no meu caso de uso comparável muito mais legível. Procure por exemplo neste bloco . Além disso, você pode até restaurar o conteúdo original a partir disso. As possíveis escolhas e pesquisas são fornecidas na seguinte lista:
U+002A * ASTERISK
), você pode usar um dos muitos listados, por exemplo,U+2217 ∗ (ASTERISK OPERATOR)
ou oFull Width Asterisk U+FF0A *
⋅ U+22C5 dot operator
“ U+201C english leftdoublequotemark
(Alternativas, veja aqui )/ SOLIDUS U+002F
), você pode usar∕ DIVISION SLASH U+2215
(outros aqui )\ U+005C Reverse solidus
), você pode usar⧵ U+29F5 Reverse solidus operator
( mais )U+005B Left square bracket
) e ](U+005D Right square bracket
), você pode usar por exemploU+FF3B[ FULLWIDTH LEFT SQUARE BRACKET
eU+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET
( daqui , mais possibilidades aqui )U+2236 ∶ RATIO (for mathematical usage)
ouU+A789 ꞉ MODIFIER LETTER COLON
, (consulte dois pontos (letra) , às vezes usado nos nomes de arquivos do Windows, pois é idêntico aos dois pontos na fonte da interface do usuário do Segoe usada para nomes de arquivos. Os dois pontos em si não são permitidos) (consulte aqui )U+037E ; GREEK QUESTION MARK
(veja aqui )U+0964 । DEVANAGARI DANDA
,U+2223 ∣ DIVIDES
ouU+01C0 ǀ LATIN LETTER DENTAL CLICK
( Wikipedia ). Além disso, os caracteres de desenho da caixa contêm várias outras opções., U+002C COMMA
), você pode usar, por exemplo‚ U+201A SINGLE LOW-9 QUOTATION MARK
(veja aqui )U+003F ? QUESTION MARK
), estes são bons candidatos:U+FF1F ? FULLWIDTH QUESTION MARK
ouU+FE56 ﹖ SMALL QUESTION MARK
(de ele voltar , mais dois de Símbolos Bloquear , procure por "pergunta")fonte
Ao criar atalhos da Internet no Windows, para criar o nome do arquivo, ele ignora caracteres ilegais, exceto a barra, que é convertida em menos.
fonte
Nos shells do Unix, você pode citar quase todos os caracteres entre aspas simples
'
. Exceto as aspas simples, e você não pode expressar caracteres de controle, porque\
não é expandido. É possível acessar a própria aspas simples a partir de uma sequência entre aspas, pois é possível concatenar as seqüências com aspas simples e duplas, como as'I'"'"'m'
que podem ser usadas para acessar um arquivo chamado"I'm"
(aspas duplas também é possível aqui).Portanto, você deve evitar todos os caracteres de controle, porque eles são muito difíceis de entrar no shell. O restante ainda é engraçado, especialmente arquivos começando com um traço, porque a maioria dos comandos os lê como opções, a menos que você tenha dois traços
--
antes ou especifique-os com./
, o que também oculta a partida-
.Se você quer ser legal, não use nenhum dos caracteres que o shell e os comandos típicos usam como elementos sintáticos, às vezes dependentes da posição, por exemplo, você ainda pode usar
-
, mas não como primeiro caractere; Da mesma forma.
, você pode usá-lo como primeiro caractere apenas quando quiser ("arquivo oculto"). Quando você é malvado, seus nomes de arquivo são sequências de escape do VT100 ;-), de modo que ls detecta a saída.fonte
Eu tinha a mesma necessidade e estava procurando recomendações ou referências padrão e me deparei com esse segmento. Minha lista negra atual de caracteres que devem ser evitados nos nomes de arquivos e diretórios são:
fonte
@
na lista?b
? lol, eu suponho que é o b delank spaces
... bem, isso ainda deixa um pouco ... Eu renomeado uma imagem(),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpg
, mas teve de mudar-lo de volta porque parecia com raiva ...