¿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)
¿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)
Respuestas:
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 CON
en 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.h
de con.h
y pasó media hora a averiguar por qué el compilador colgado.
Resulta DOS ignorados extensiones para los dispositivos de modo que con.h
era 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).
POSIX "Fully portable filenames"
entrada, que enumera estos:A–Z a–z 0–9 . _ -
OK, así que mira la Comparación de sistemas de archivos si solo te interesan los sistemas de archivos de los jugadores principales:
NUL
, \
, /
, :
, *
, "
, <
, >
, |
. Además, no hay caracteres de espacio al principio o al final, y no hay punto al final .:
o/
NUL
o/
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).
/
. Windows no permite la barra invertida y algunas cadenas (p CON
. Ej .).
:
s en sus nombres.
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.
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.
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
:return: a valid name for Win/Mac/Linux
no es cierto en todas las circunstancias.