Caracteres permitidos en el nombre del archivo

139

¿Dónde puedo encontrar una lista de caracteres permitidos en los nombres de archivo, dependiendo del sistema operativo? (por ejemplo, en Linux, el carácter :está permitido en los nombres de archivo, pero no en Windows)

tipo pitón
fuente
.NET proporciona esa información para Windows.
leppie
8
@kreker tenga en cuenta que su pregunta es sobre Android
congusbongus

Respuestas:

107

Deberías comenzar con la página de nombre de archivo de Wikipedia . Tiene una tabla de tamaño decente ( Comparación de limitaciones de nombre de archivo ), que enumera los caracteres reservados para muchos sistemas de archivos.

También tiene una gran cantidad de otra información sobre cada sistema de archivos, incluidos los nombres de archivos reservados, como CONen MS-DOS. He mencionado que sólo porque me picaron por que una vez cuando me acorté un archivo de inclusión a partir const.hde con.hy pasó media hora a averiguar por qué el compilador colgado.

Resulta DOS ignorados extensiones para los dispositivos de modo que con.hera exactamente el mismo que con, la consola de entrada (lo que significa, por supuesto, el compilador me estaba esperando a escribo en el archivo de cabecera antes de que continuaría).

paxdiablo
fuente
44
La página de Wikipedia me parece un tanto vaga y confusa, por ejemplo, "Algunos sistemas operativos prohíben algunos caracteres en particular ...". De hecho, estoy buscando una tabla completa que enumere todos los caracteres permitidos y no permitidos.
Python amigo
77
@python, no mires esa tabla, mira la gran honkin 'debajo de ella (titulada "Comparación de limitaciones de nombre de archivo"). Eso no es tan vago en su contenido.
paxdiablo
52
Probablemente todo lo que necesita es mirar la POSIX "Fully portable filenames"entrada, que enumera estos:A–Z a–z 0–9 . _ -
Vladimir Kornea
1
@VladimirKornea gracias! Enlaces: pubs.opengroup.org/onlinepubs/9699919799/basedefs/… || pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CpILL Hay más sistemas operativos que solo Windows, OSX y Linux ... algunos tienen sistemas de archivos muy simples.
dados elegantes
33

OK, así que mira la Comparación de sistemas de archivos si solo te interesan los sistemas de archivos de los jugadores principales:

por lo que cualquier byte de excepción NUL, \, /, :, *, ", <, >, |y no se puede tener archivos / carpetas llamar .o ..y no hay caracteres de control (por supuesto).

CpILL
fuente
77
Esto no es correcto. Linux no lo permite /. Windows no permite la barra invertida y algunas cadenas (p CON. Ej .).
kgadek el
77
Sí, por eso dije excepto .
CpILL
2
En Mac (ejecutando HFS +), puedo crear archivos con :s en sus nombres.
erwaman
Esto no es correcto. Vea esta respuesta para más caracteres que Windows no permite.
mbomb007
Windows tampoco permite caracteres de control (pero la Mac sí, excepto NUL)
Thomas Tempelmann
23

En el sistema operativo Windows, cree un archivo y asígnele un carácter no válido como \en el nombre del archivo. Como resultado, aparecerá una ventana emergente con todos los caracteres no válidos en un nombre de archivo.

ingrese la descripción de la imagen aquí

Devid
fuente
5

Para ser más precisos sobre Mac OS X (ahora llamado MacOS) /en el Finder se interpreta :en el sistema de archivos Unix.

Esto se hizo por compatibilidad con versiones anteriores cuando Apple se mudó del Mac OS clásico.

Es legítimo usar un /nombre de archivo en el Finder, mirando el mismo archivo en el terminal que aparecerá con un: .

Y también funciona al revés: no puedes usar un /nombre de archivo en el terminal, pero a :está bien y aparecerá como /en el Finder.

Algunas aplicaciones pueden ser más restrictivas y prohíben ambos caracteres para evitar confusiones o porque mantienen la lógica del sistema operativo Mac clásico anterior o por compatibilidad de nombres entre plataformas.

Jean Létourneau
fuente
0

Para los nombres de archivo de "configuración regional en inglés", esto funciona bien. Estoy usando esto para desinfectar los nombres de los archivos cargados. El nombre del archivo no debe estar vinculado a nada en el disco, es para cuando el archivo se está descargando, por lo tanto, no hay comprobaciones de ruta.

$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);

Básicamente, elimina todos los caracteres no imprimibles y reservados para Windows y otros sistemas operativos. Puede extender fácilmente el patrón para admitir otras configuraciones regionales y funcionalidades.

TheRealChx101
fuente
-1

Aquí está el código para limpiar el nombre del archivo en 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.
fuente
2
El código no verifica los nombres no válidos (reservados) y tampoco busca un carácter no válido en replace_space_with. La longitud del nombre del archivo está fuera del alcance. Por lo tanto, :return: a valid name for Win/Mac/Linuxno es cierto en todas las circunstancias.
ack