2010-03-23 19 views
5

Existen algunos caracteres restringidos (e incluso nombres de archivo completos, en Windows) para nombres de archivos y directorios. Este other question ya los cubre.Cómo recuperar caracteres prohibidos para nombres de archivos, en Java?

¿Hay alguna manera, en Java, de recuperar esta lista de caracteres prohibidos, que dependería del sistema (un poco como recuperar los caracteres line breaker)? ¿O solo puedo poner la lista yo mismo, buscando el sistema?


Editar: Más antecedentes sobre mi situación particular, aparte de la cuestión general.

Utilizo un nombre predeterminado, proveniente de algunos datos (sin control real sobre su contenido), y este nombre se le da a JFileChooser, como nombre de archivo predeterminado para usar (con setSelectedFile()). Sin embargo, este trunca todo antes del último carácter no válido.

Estos nombres predeterminados ocasionalmente finalizan con las fechas en un formato "mm/dd/aa", que deja solo el "yy", en el nombre predeterminado, porque "/" están prohibidos. Como tal, buscar Excepciones no es realmente una opción allí, porque el archivo en sí ni siquiera está creado.

Editar bis: Hmm, eso me hace pensar que, si se JFileChooser truncar el nombre, es probable que tenga acceso a una lista de dichos caracteres, puede ser interesante comprobar que más.

Editar ter: Bueno, consultar las fuentes de JFileChooser muestra algo completamente simple. Para el campo de texto, usa file.getName(). En realidad, no verifica si hay caracteres no válidos, es simplemente que toma el "/" como un separador de ruta, y guarda solo el final, el "nombre de archivo real". Otros personajes prohibidos realmente pasan.

Respuesta

4

Cuando se trata de lidiar con los caracteres "prohibidos" Prefiero ser precavido y la prohibición/reemplazar todos los caracteres "especiales" que pueden causar un problema en cualquier sistema de archivos.

Aunque técnicamente permitido, a veces esos caracteres pueden causar rareza.

Por ejemplo, tuvimos un problema donde los archivos PDF se escribían (con éxito) en una SAN, pero cuando se publicaban a través de un servidor web desde esa ubicación algunos de los caracteres causaban problemas cuando insertábamos el PDF en una página HTML que se estaba procesando en Firefox. Estuvo bien si se accede directamente al PDF y está bien en otro navegador. Algún error extraño con la forma en que Firefox y Adobe Reader interactúan.

Resumen: caracteres "especiales" en los nombres de archivos -> errores extraños a punto de ocurrir

En última instancia, la única manera de estar seguro es utilizar una lista blanca.

+0

Define "carácter especial". –

+0

+1 para la lista blanca –

+2

+1 En la mayoría de los sistemas de archivos UNIX-y, los únicos caracteres prohibidos son '/' y el carácter nulo '\ 0'. –

-2

Eche un vistazo a este enlace para obtener información sobre cómo obtener el sistema operativo en el que se ejecuta la aplicación. Básicamente, necesita usar System.getProperty ("os.name") y hacer un igual() o contains() para averiguar el sistema operativo.

Sin embargo, algo de lo que cansarnos es que conocer el sistema operativo no necesariamente indica el sistema de archivos subyacente que se está utilizando, por ejemplo, una Mac puede leer y escribir en el sistema de archivos FAT32.

fuente: http://www.mkyong.com/java/how-to-detect-os-in-java-systemgetpropertyosname/

2

Tener ciertos "caracteres prohibidos" es solo una de las muchas cosas que pueden salir mal al crear un archivo (otros son derechos de acceso y longitudes de archivos y rutas).

Realmente no tiene sentido tratar de detectar algunos de estos principios cuando hay otros que no puede detectar hasta que realmente intenta crear el archivo. Solo maneje las excepciones apropiadamente.

+0

El hecho es que este nombre es uno predeterminado recuperado de algunos datos, por lo que puede contener caracteres que no son adecuados para un nombre de archivo. Este predeterminado se le da a JFileChooser, y este está truncando todo antes de un carácter prohibido. Entonces, en tal caso, tendría que reemplazar estos caracteres antes, para que el predeterminado tenga sentido. En este contexto, no se lanza ninguna excepción, ya que el archivo no se creó aún. – Gnoupi

+1

¿No puedes hacer un defecto seguro? (como usar solo ascii-7?). Por otro lado, usted puede: 1) pasar el valor predeterminado de su candidato a JFileChooser 2) solicitar la cadena truncada (sin mostrar el diálogo) 3) si el nombre de archivo devuelto es más corto, usted sabe dónde está el carácter prohibido. – helios

+0

Mi parte con JFileChooser fue de hecho un problema solo cuando uso separadores de ruta, como se describe ahora en mi pregunta. Para otros caracteres prohibidos, JfileChooser no filtra nada, simplemente devuelve lo que se ingresó como nombre de archivo. Su solución es probablemente la más fácil, verificando simplemente cuando intenta escribir el archivo y manejando la excepción. – Gnoupi

2

¿Ha intentado utilizar File.getCanonicalPath y comparándolo con el nombre de archivo original (o lo que se recupera de getAbsolutePath)?

Esto no le dará los caracteres reales, pero puede ayudarlo a determinar si este es un nombre de archivo válido en el sistema operativo en el que se está ejecutando.

Cuestiones relacionadas