Caracteres permitidos no nome do arquivo

138

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)

cara python
fonte
O .NET fornece essas informações para o Windows.
Leppie
8
nota @kreker que a sua pergunta é sobre Android
congusbongus

Respostas:

106

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 CONno 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.hde con.he passou meia hora tentando descobrir porque o compilador pendurado.

Acontece DOS ignorado extensões para dispositivos de modo que con.hera 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).

paxdiablo
fonte
4
Acho a página da Wikipedia um tanto vaga e confusa, por exemplo, "Alguns sistemas operacionais proíbem alguns caracteres em particular ...". Na verdade, estou procurando uma tabela completa que lista todos os caracteres permitidos e não permitidos.
Python dude
7
@ python, não olhe para a tabela, veja a grande lista abaixo dela (intitulada "Comparação de limitações de nome de arquivo"). Isso não é tão vago em seu conteúdo.
21411 Paxdiablo
52
Provavelmente tudo que você precisa é de olhar para a POSIX "Fully portable filenames"entrada, que lista estes:A–Z a–z 0–9 . _ -
Vladimir Kornea
1
@CpILL Existem mais sistemas operacionais do que apenas Windows, OSX e Linux ... alguns têm sistemas de arquivos muito simples.
elegant dice
32

OK, então veja Comparação de sistemas de arquivos se você se importa apenas com os principais sistemas de arquivos dos players:

portanto, qualquer byte, exceto NUL, \, /, :, *, ", <, >, |e você não pode ter arquivos / pastas chamar .ou ..e sem caracteres de controle (é claro).

CpILL
fonte
7
Isso não está correto. Linux não permite /. O Windows não permite barra invertida e algumas strings (por exemplo CON).
kgadek
7
Sim, daí eu disse, exceto .
CpILL
2
No Mac (executando HFS +), sou capaz de criar arquivos com :s em seus nomes.
erwaman
Isso não está correto. Veja esta resposta para mais caracteres que o Windows não permite.
mbomb007
O Windows não permite quaisquer caracteres controles, seja (mas o Mac faz, que não seja NUL)
Thomas Tempelmann
23

No sistema operacional Windows, crie um arquivo e atribua um caractere inválido, como \no nome do arquivo. Como resultado, você receberá um pop-up com todos os caracteres inválidos em um nome de arquivo.

insira a descrição da imagem aqui

Devid
fonte
5

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.

Jean Létourneau
fonte
0

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.

TheRealChx101
fonte
-1

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
Du D.
fonte
2
O código não verifica nomes inválidos (reservados) e também não verifica caracteres inválidos em replace_space_with. O comprimento do nome do arquivo está além do escopo. Portanto, :return: a valid name for Win/Mac/Linuxnão é verdade em todas as circunstâncias.
ack