Sé que / es ilegal en Linux, y lo siguiente es ilegal en Windows (creo) *
.
"
/
\
[
]
:
;
|
,
¿Qué más me estoy perdiendo?
Sin embargo, necesito una guía completa que tenga en cuenta los caracteres de doble byte. Vincular a recursos externos está bien para mí.
Primero necesito crear un directorio en el sistema de archivos usando un nombre que pueda contener caracteres prohibidos, así que planeo reemplazar esos caracteres con guiones bajos. Luego necesito escribir este directorio y su contenido en un archivo zip (usando Java), por lo que cualquier consejo adicional sobre los nombres de los directorios zip sería apreciado.
echo abc > "ab.;,=[1]"
Respuestas:
Una "guía completa" de caracteres de nombre de archivo prohibidos no funcionará en Windows porque reserva nombres de archivo y caracteres. Sí, los caracteres como
*
"
?
y otros están prohibidos, pero hay un número infinito de nombres compuestos solo por caracteres válidos que están prohibidos. Por ejemplo, los espacios y puntos son caracteres válidos de nombre de archivo, pero los nombres compuestos solo por esos caracteres están prohibidos.Windows no distingue entre mayúsculas y minúsculas, por lo que no puede crear una carpeta con nombre
A
sia
ya existe una con nombre . Peor, los nombres aparentemente permitidos comoPRN
yCON
, y muchos otros, están reservados y no permitidos. Windows también tiene varias restricciones de longitud; un nombre de archivo válido en una carpeta puede volverse inválido si se mueve a otra carpeta. Las reglas para nombrar archivos y carpetas están en los documentos de Microsoft.En general, no puede usar texto generado por el usuario para crear nombres de directorio de Windows. Si desea permitir a los usuarios a nombre de todo lo que quieran, hay que crear nombres seguros como
A
,AB
,A2
et al., Nombres de las tiendas generados por los usuarios y sus equivalentes de ruta en un archivo de datos de la aplicación, y realizar el mapeo de ruta en su aplicación.Si absolutamente debe permitir nombres de carpetas generados por el usuario, la única forma de saber si son inválidos es detectar excepciones y asumir que el nombre no es válido. Incluso eso está plagado de peligros, ya que las excepciones lanzadas para el acceso denegado, las unidades fuera de línea y el espacio fuera de la unidad se superponen con las que se pueden lanzar por nombres no válidos. Estás abriendo una enorme lata de dolor.
fuente
A.txt
es válido porquea.TXT
puede existir.COPY CON PRN
significa leer desde la entrada del teclado, o posible stdin, y copiarlo al dispositivo de la impresora. No estoy seguro de que siga siendo válido en las ventanas modernas, pero ciertamente lo fue durante mucho tiempo. En los viejos tiempos, podía usarlo para escribir texto y tener una impresora de matriz de puntos simplemente emitirlo.Hagámoslo simple y respondamos la pregunta primero.
Los caracteres ASCII imprimibles prohibidos son:
Linux / Unix:
Ventanas:
Caracteres no imprimibles
Si sus datos provienen de una fuente que permitiría caracteres no imprimibles, entonces hay más para verificar.
Linux / Unix:
Ventanas:
Nota: Si bien es legal bajo los sistemas de archivos Linux / Unix crear archivos con caracteres de control en el nombre del archivo, puede ser una pesadilla para los usuarios tratar con dichos archivos .
Nombres de archivo reservados
Los siguientes nombres de archivo están reservados:
Ventanas:
(tanto solos como con extensiones de archivo arbitrarias, por ejemplo
LPT1.txt
).Otras reglas
Ventanas:
Los nombres de archivo no pueden terminar en un espacio o punto.
fuente
Bajo Linux y otros sistemas relacionados con Unix, solo hay dos caracteres que no pueden aparecer en el nombre de un archivo o directorio, y esos son NUL
'\0'
y barra oblicua'/'
. La barra oblicua, por supuesto, puede aparecer en un nombre de ruta, separando los componentes del directorio.El rumor 1 dice que Steven Bourne (de fama 'shell') tenía un directorio que contenía 254 archivos, uno por cada letra (código de carácter) que puede aparecer en un nombre de archivo (excluyendo
/
,'\0'
el nombre.
era el directorio actual, por supuesto ) Se usó para probar el shell Bourne y ocasionar estragos en programas incautos como los programas de respaldo.Otras personas han cubierto las reglas de Windows.
Tenga en cuenta que MacOS X tiene un sistema de archivos que no distingue entre mayúsculas y minúsculas.
1 Fue Kernighan & Pike en The Practice of Programming quien dijo lo mismo en el Capítulo 6, Pruebas, §6.5 Pruebas de resistencia:
Tenga en cuenta que el directorio debe haber contenido entradas
.
y..
, por lo tanto, podría decirse que eran 253 archivos (y 2 directorios) o 255 entradas de nombre, en lugar de 254 archivos. Esto no afecta la efectividad de la anécdota o las pruebas cuidadosas que describe.fuente
/
nombre. Eso causó algunos problemas, ya que creó un nuevo directorio con el esquema.PATH
variable Unix porque dos puntos se usan como separador (punto y coma en Windows). Por lo tanto, los programas en dicho directorio deben ejecutarse con un nombre de ruta que especifique dónde está (podría ser relativo o absoluto), o debe estar en el directorio y tener un punto (.
el directorio actual)PATH
, que es ampliamente considerado como Un inseguro.En lugar de crear una lista negra de caracteres, puede usar una lista blanca . A fin de cuentas, el rango de caracteres que tiene sentido en un contexto de nombre de archivo o directorio es bastante corto, y a menos que tenga algunos requisitos de nomenclatura muy específicos, sus usuarios no lo incluirán en su aplicación si no pueden usar toda la tabla ASCII.
No resuelve el problema de los nombres reservados en el sistema de archivos de destino, pero con una lista blanca es más fácil mitigar los riesgos en la fuente.
En ese espíritu, esta es una gama de personajes que pueden considerarse seguros:
Y cualquier personaje seguro adicional que desee permitir. Más allá de esto, solo tiene que aplicar algunas reglas adicionales con respecto a espacios y puntos . Esto suele ser suficiente:
Esto ya permite nombres bastante complejos y sin sentido. Por ejemplo, estos nombres serían posibles con estas reglas y serían nombres de archivo válidos en Windows / Linux:
A...........ext
B -.- .ext
En esencia, incluso con tan pocos caracteres en la lista blanca, aún debe decidir qué tiene sentido y validar / ajustar el nombre en consecuencia. En una de mis aplicaciones, utilicé las mismas reglas que antes pero eliminé los puntos y espacios duplicados.
fuente
La manera fácil de hacer que Windows le diga la respuesta es intentar cambiar el nombre de un archivo a través del Explorador y escribir / para el nuevo nombre. Windows abrirá un cuadro de mensaje que le indicará la lista de caracteres ilegales.
https://support.microsoft.com/en-us/kb/177506
fuente
Bueno, aunque solo sea para fines de investigación, entonces su mejor opción es mirar esta entrada de Wikipedia sobre nombres de archivos .
Si desea escribir una función portátil para validar la entrada del usuario y crear nombres de archivo basados en eso, la respuesta corta es no . Eche un vistazo a un módulo portátil como Perl's File :: Spec para echar un vistazo a todos los saltos necesarios para realizar una tarea tan "simple".
fuente
Para Windows puede verificarlo usando PowerShell
Para mostrar códigos UTF-8, puede convertir
fuente
En Windows 10 (2019), los siguientes caracteres están prohibidos por un error cuando intenta escribirlos:
fuente
Aquí está la implementación de ac # para Windows basada en la respuesta de Christopher Oezbek
Se hizo más complejo por el booleano contiene carpeta, pero es de esperar que cubra todo
fuente
StringBuilder
con el valor de capacidad inicial? 2. ¿Por qué agregaste 12 a la longitud defilename
? 3. ¿Se eligió 12 arbitrariamente o se pensó algo detrás de este número?A partir del 18/04/2017, no hay una lista simple en blanco o negro de caracteres y nombres de archivos entre las respuestas a este tema, y hay muchas respuestas.
La mejor sugerencia que se me ocurrió fue dejar que el usuario nombrara el archivo como quisiera. Usando un controlador de errores cuando la aplicación intenta guardar el archivo, detectar cualquier excepción, asumir que el nombre de archivo es el culpable (obviamente, después de asegurarse de que la ruta de guardado también esté bien) y solicitar al usuario un nuevo nombre de archivo. Para obtener mejores resultados, coloque este procedimiento de verificación dentro de un ciclo que continúa hasta que el usuario lo haga bien o se dé por vencido. Funcionó mejor para mí (al menos en VBA).
fuente
Aunque los únicos caracteres ilegales de Unix pueden ser
/
yNULL
, aunque se debe incluir alguna consideración para la interpretación de la línea de comandos.Por ejemplo, si bien puede ser legal nombrar un archivo
1>&2
o2>&1
en Unix, los nombres de archivo como este pueden malinterpretarse cuando se usan en una línea de comando.De manera similar, podría ser posible nombrar un archivo
$PATH
, pero cuando intente acceder a él desde la línea de comandos, el shell se traducirá$PATH
a su valor variable.fuente
$'myvalueis'
, por ejemplo$ echo 'hi' > $'2>&1'
,cat 2\>\&1
"hola"Las dificultades para definir, qué es legal y qué no , ya se abordaron y se sugirieron listas blancas . Pero Windows admite caracteres de más de 8 bits . Wikipedia dice que (por ejemplo) el
Por lo tanto, quiero presentar un enfoque mucho más liberal utilizando caracteres Unicode para reemplazar los "ilegales". Encontré el resultado en mi caso de uso comparable mucho más legible. Mira por ejemplo en este bloque . Además, incluso puede restaurar el contenido original a partir de eso. Las posibles opciones e investigaciones se proporcionan en la siguiente lista:
U+002A * ASTERISK
), puede usar uno de los muchos enumerados, por ejemploU+2217 ∗ (ASTERISK OPERATOR)
o elFull Width Asterisk U+FF0A *
⋅ U+22C5 dot operator
“ U+201C english leftdoublequotemark
(Alternativas ver aquí )/ SOLIDUS U+002F
), puede usar∕ DIVISION SLASH U+2215
(otros aquí )\ U+005C Reverse solidus
), puede usar⧵ U+29F5 Reverse solidus operator
( más )U+005B Left square bracket
) y ](U+005D Right square bracket
), puede usar por ejemploU+FF3B[ FULLWIDTH LEFT SQUARE BRACKET
yU+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET
(desde aquí , más posibilidades aquí )U+2236 ∶ RATIO (for mathematical usage)
oU+A789 ꞉ MODIFIER LETTER COLON
, (ver dos puntos (letra) , a veces se usa en los nombres de archivo de Windows, ya que es idéntico a los dos puntos en la fuente Segoe UI utilizada para los nombres de archivo. Los dos puntos en sí no están permitidos) (Ver aquí )U+037E ; GREEK QUESTION MARK
(ver aquí )U+0964 । DEVANAGARI DANDA
,U+2223 ∣ DIVIDES
oU+01C0 ǀ LATIN LETTER DENTAL CLICK
( Wikipedia ). Además, los caracteres del cuadro de dibujo contienen varias otras opciones., U+002C COMMA
), puede usar por ejemplo‚ U+201A SINGLE LOW-9 QUOTATION MARK
(ver aquí )U+003F ? QUESTION MARK
), estos son buenos candidatos:U+FF1F ? FULLWIDTH QUESTION MARK
oU+FE56 ﹖ SMALL QUESTION MARK
(a partir de él re , dos más de Script bloque , buscar "cuestión")fuente
Al crear accesos directos a Internet en Windows, para crear el nombre del archivo, omite los caracteres ilegales, excepto la barra diagonal, que se convierte en menos.
fuente
En shells de Unix, puede citar casi todos los caracteres entre comillas simples
'
. Excepto la comilla simple en sí, y no puede expresar caracteres de control, porque\
no está expandido. Es posible acceder a la comilla simple dentro de una cadena entre comillas, porque puede concatenar cadenas con comillas simples y dobles, como las'I'"'"'m'
que se pueden usar para acceder a un archivo llamado"I'm"
(la comilla doble también es posible aquí).Por lo tanto, debe evitar todos los caracteres de control, porque son demasiado difíciles de ingresar en el shell. El resto sigue siendo divertido, especialmente los archivos que comienzan con un guión, porque la mayoría de los comandos los leen como opciones a menos que tenga dos guiones
--
antes, o los especifique con./
, lo que también oculta el inicio-
.Si quiere ser amable, no use ninguno de los caracteres que el shell y los comandos típicos usan como elementos sintácticos, a veces dependientes de la posición, por lo que, por ejemplo, aún puede usar
-
, pero no como primer carácter; lo mismo con.
, puede usarlo como primer carácter solo cuando lo diga en serio ("archivo oculto"). Cuando eres malo, los nombres de tus archivos son secuencias de escape VT100 ;-), de modo que un ls confunde la salida.fuente
Tenía la misma necesidad y estaba buscando recomendaciones o referencias estándar y encontré este hilo. Mi lista negra actual de caracteres que se deben evitar en los nombres de archivo y directorio son:
fuente
@
en la lista?b
? lol, supongo que esa es la b delank spaces
... bueno, eso todavía deja algunos ...(),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpg