JRE 6, en Windows XP.Java: Incoherencias de File.exists() al establecer "user.dir"
La duplicación de dos objetos de archivo con diferentes constructores genera resultados incoherentes en el método File.exists()
.
responsabilidad: el código de abajo es un resumen, no el código real. No creo que esto sea un problema de File.separator en absoluto. Primero pedí reacciones tempranas, por si me perdía un tema bien entendido. Parece que restablecer la propiedad del sistema user.dir
es una de las causas de este problema. El código a continuación ahora es reproducible y utilizable tal cual. Puede copiar/pegar la clase Java y probarla, debe comportarse de manera consistente con lo que he enumerado como resultados.
Configuración:
Crear la arquitectura carpeta C:\toto\tmp\sub
.
Inicie la siguiente clase desde cualquier carpeta que no contenga una arquitectura de subcarpeta tmp/sub
.
Código:
public class TestFileExists {
public static void main(String[] args) {
System.setProperty("user.dir", "C:\\toto\\");
File root = new File("tmp");
File sub_a = new File(root, "sub");
File sub_b = new File(root.getAbsolutePath()+"/sub");
System.out.println("sub_a path ? "+sub_a.getAbsolutePath());
System.out.println("sub_a exists ? "+sub_a.exists());
System.out.println("sub_b path ? "+sub_b.getAbsolutePath());
System.out.println("sub_b exists ? "+sub_b.exists());
System.out.println("Path equals ? "+ (sub_a.getAbsolutePath().equals(sub_b.getAbsolutePath())));
System.out.println("Obj equals ? "+ (sub_a.equals(sub_b)));
}
}
Resultado:
sub_a path ? C:\toto\tmp\sub
sub_a exists ? false
sub_b path ? C:\toto\tmp\sub
sub_b exists ? true
Path equals ? true
Obj equals ? false
No entiendo la línea sub_a exists ? false
, y el resultado no es consistente de una máquina a otra, ni con el raíz ruta inicial y el resultado ahora es coherente con de máquina a máquina.
Ahora si, vuelva a ejecutar la clase llamando Java desde la línea de comandos, desde una carpeta, que contiene una arquitectura subcarpeta tmp/sub
(como si se llama desde D:\
, teniendo D:\tmp\sub
), recibirá la esperada:
sub_a path ? C:\toto\tmp\sub
sub_a exists ? true
sub_b path ? C:\toto\tmp\sub
sub_b exists ? true
Path equals ? true
Obj equals ? false
Pero la existencia de sub_a
es claramente un falso positivo, porque comprueba la existencia de otra carpeta que el descrito por el getAbsolutePath()
.
por lo que sospecho fuertemente que File.exists()
depende de la trayectoria real de ejecución de Java, y que la existencia de archivos no es consistente con la ruta absoluta, y exists()
utiliza otro camino que la propiedad del sistema "user.dir" para comprobar el sistema de archivos.
¿Alguna idea de dónde podría venir este problema?
Conjetura salvaje: algunos atributos estropeados en un directorio intermediario que se atraviesa con la ruta absoluta. –
En Windows XP con JDK 1.6.0_16 y Java 1.6.0_18, me hago verdadero, cierto. verdadero Falso. Habiendo dicho eso, mi directorio no tiene espacios, caracteres especiales ni permisos denegados. – Powerlord
Downvoter puede explicar por qué? – glmxndr