JRE 6, su Windows XP.Java: incoerenze File.exists() quando si imposta "user.dir"
L'installazione di due oggetti File con diversi costruttori porta a risultati incoerenti nel metodo File.exists()
.
responsabilità: il codice qui sotto rappresenta un estratto, non il codice vero e proprio. Non credo che questo sia un problema File.separator. Prima ho chiesto di ottenere reazioni tempestive, nel caso in cui mi fossi perso un problema ben compreso. Sembra che la reimpostazione della proprietà di sistema user.dir
sia una delle cause di questo problema. Il codice sotto è ora riproducibile e utilizzabile così com'è. Puoi copiare/incollare la classe Java e provarla, dovrebbe comportarsi in modo coerente con ciò che ho elencato come risultato.
Setup:
Creare l'architettura della cartella C:\toto\tmp\sub
.
Avviare la seguente classe da qualsiasi cartella che non contenga un'architettura di sottocartella tmp/sub
.
Codice:
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)));
}
}
Risultato:
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
Non capisco la linea sub_a exists ? false
, e il risultato non è coerente da macchina a macchina, né con la percorso iniziale root il risultato ora è coerente con da macchina a macchina.
Ora, se si rieseguire la classe chiamando Java dalla riga di comando, da una cartella che contiene un'architettura sottocartella tmp/sub
(come se si chiama da D:\
, avendo D:\tmp\sub
), si otterrà l'atteso:
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
Ma l'esistenza di sub_a
è chiaramente un falso positivo, perché controlla l'esistenza di una cartella diversa da quella descritta dal getAbsolutePath()
.
Così ho il forte sospetto che File.exists()
dipende l'attuale percorso di esecuzione Java, e che il file esistenza non è coerente con il percorso assoluto, e exists()
utilizza un altro percorso rispetto alla proprietà di sistema "user.dir" per controllare il file system.
Qualche idea di questo problema?
Wild guess: alcuni attributi avvitati su una directory intermedia che viene attraversata con il percorso assoluto. –
Su Windows XP con JDK 1.6.0_16 e Java 1.6.0_18, ottengo vero, vero. vero falso. Detto questo, la mia directory non ha spazi, caratteri speciali o autorizzazioni negate su di essa. – Powerlord
Il downgoter può spiegare perché? – glmxndr