2011-09-01 20 views
10

Estoy intentando construir un objeto de archivo Java basado en un nombre de archivo proporcionado por el usuario (podría ser absoluto o relativo) y un directorio base dependiente del entorno. El documento java para java.io.File (padre del archivo, Cadena niño) dice lo siguiente:java.io.File (principal, secundario) no funciona como se esperaba

Si la cadena de nombre de ruta absoluta niño es entonces se convierte en una ruta relativa de una manera dependiente del sistema.

que me hizo pensar que si tengo el siguiente código:

public class TestClass { 
    public static void main(String[] args) throws IOException { 
     File file = new File(new File("C:/Temp"),"C:/Temp/file.txt"); 
     System.out.println(file.getAbsolutePath()); 
    } 
} 

la salida sería

C:\Temp\file.txt 

y entonces estaría en el negocio, ya que no sería realmente importa más si el usuario proporcionó una ruta absoluta o relativa. Pero, de hecho, la salida es

C:\Temp\C:\Temp\file.txt 

Lo que significa que tengo que averiguar la ruta relativa exacta (o al menos prueba diferentes opciones para ver si existe el archivo). ¿Estoy entendiendo mal el JavaDoc?

+0

El nombre de ruta hijo tiene que ser un nombre de ruta relativo. La conversión habla de barras contra barras invertidas, creo. En tu caso, tendrías que averiguar si la ruta es absoluta antes de continuar. – Thilo

+0

¿El comportamiento es el mismo si usa los (más correctos) '" C: \\ Temp "' y '" C: \\ Temp \\ file.txt "' en lugar de usar reenvíos? No tengo una PC con Windows con un JDK instalado aquí en este momento, así que no puedo probar esto. Además, ¿qué significa 'nuevo archivo (" C:/Temp "). IsAbsolute()' print? –

+0

@Joachim: Ambos '" C:/Temp "' y '" C: \\ Temp "' son tratados de la misma manera. 'nuevo archivo (" C:/Temp "). isAbsolute()' imprime 'true'. – Geert

Respuesta

7

Si la cadena de nombre de ruta niño es absoluto, entonces se convierte en una ruta relativa de una manera dependiente del sistema.

I asumen esto significa que incluso si se proporciona una ruta absoluta, se convierte en (de una manera dependiente del sistema), y se trató como, una ruta relativa.

Lo que significa que tengo que averiguar la ruta relativa exacta (o al menos prueba diferentes opciones para ver si existe el archivo).

Sí, creo que sí.

Esto quizás podría hacerse fácilmente con

file.getAbsolutePath().startsWith(parent.getAbsolutePath()); 

para comprobar si se trata de una ruta absoluta a un directorio en parent y

file.getAbsolutePath().substring(parent.getAbsolutePath().length()); 

para obtener la parte relativa.

+0

Hmm, podría estar en lo cierto al decir que la ruta absoluta se trata como una ruta relativa (sin duda es lo que parece). Eso sería una pena (y pobre Javahoc imho ;-)). Me ocuparé un poco de tus sugerencias para ver qué me funciona, ¡gracias! – Geert

Cuestiones relacionadas