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)


.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).


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
@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).


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í


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.


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.


-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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.