Onde posso encontrar uma lista de caracteres permitidos nos nomes de arquivos, dependendo do sistema operacional? (por exemplo, no Linux, o personagem :
é permitido nos nomes de arquivos, mas não no Windows)
Onde posso encontrar uma lista de caracteres permitidos nos nomes de arquivos, dependendo do sistema operacional? (por exemplo, no Linux, o personagem :
é permitido nos nomes de arquivos, mas não no Windows)
Respostas:
Você deve começar com a página Nome do arquivo da Wikipedia . Possui uma tabela de tamanho decente ( comparação de limitações de nome de arquivo ), listando os caracteres reservados para muitos sistemas de arquivos.
Ele também possui inúmeras outras informações sobre cada sistema de arquivos, incluindo nomes de arquivos reservados, como CON
no MS-DOS. I mencionar que só porque eu fui mordido por que uma vez quando eu encurtado um arquivo de inclusão a partir const.h
de con.h
e passou meia hora tentando descobrir porque o compilador pendurado.
Acontece DOS ignorado extensões para dispositivos de modo que con.h
era exatamente o mesmo que con
, o console de entrada (o que significa, é claro, o compilador estava esperando por mim para digitar o arquivo de cabeçalho antes que ele iria continuar).
POSIX "Fully portable filenames"
entrada, que lista estes:A–Z a–z 0–9 . _ -
OK, então veja Comparação de sistemas de arquivos se você se importa apenas com os principais sistemas de arquivos dos players:
NUL
, \
, /
, :
, *
, "
, <
, >
, |
. Além disso, nenhum caractere de espaço no início ou no final e nenhum ponto no final .:
ou/
NUL
ou/
portanto, qualquer byte, exceto NUL
, \
, /
, :
, *
, "
, <
, >
, |
e você não pode ter arquivos / pastas chamar .
ou ..
e sem caracteres de controle (é claro).
/
. O Windows não permite barra invertida e algumas strings (por exemplo CON
).
:
s em seus nomes.
Para ser mais preciso sobre o Mac OS X (agora chamado MacOS) /
no Finder, é interpretado como:
no sistema de arquivos Unix.
Isso foi feito para compatibilidade com versões anteriores quando a Apple saiu do Classic Mac OS.
É legítimo usar a /
em um nome de arquivo no Finder, olhando para o mesmo arquivo no terminal em que ele será exibido.:
.
E funciona de maneira inversa: você não pode usar a /
em um nome de arquivo com o terminal, mas a :
está OK e aparecerá como /
no Finder.
Alguns aplicativos podem ser mais restritivos e proibir os dois caracteres para evitar confusão ou porque mantiveram a lógica do Mac OS Classic anterior ou para compatibilidade de nomes entre plataformas.
Para nomes de arquivos "localidade em inglês", isso funciona muito bem. Estou usando isso para limpar os nomes de arquivos enviados. O nome do arquivo não deve estar vinculado a nada no disco, é para quando o arquivo estiver sendo baixado, portanto, não há verificação de caminho.
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
Basicamente, remove todos os caracteres não imprimíveis e reservados para Windows e outros sistemas operacionais. Você pode estender facilmente o padrão para suportar outros códigos de idioma e funcionalidades.
Aqui está o código para limpar o nome do arquivo em python.
import unicodedata
def clean_name(name, replace_space_with=None):
"""
Remove invalid file name chars from the specified name
:param name: the file name
:param replace_space_with: if not none replace space with this string
:return: a valid name for Win/Mac/Linux
"""
# ref: https://en.wikipedia.org/wiki/Filename
# ref: /programming/4814040/allowed-characters-in-filename
# No control chars, no: /, \, ?, %, *, :, |, ", <, >
# remove control chars
name = ''.join(ch for ch in name if unicodedata.category(ch)[0] != 'C')
cleaned_name = re.sub(r'[/\\?%*:|"<>]', '', name)
if replace_space_with is not None:
return cleaned_name.replace(' ', replace_space_with)
return cleaned_name
:return: a valid name for Win/Mac/Linux
não é verdade em todas as circunstâncias.