2011-11-03 14 views
6

Codice:Esiste un modo corretto per verificare la presenza di file/directory in Java?

String dir = //Path to the directory 
File saveDir = new File(dir); 
//Here comes the existence check 
if(!saveDir.exists()) 
    saveDir.mkdirs(); 

Questa parte del codice viene utilizzato per salvare i file con un determinato percorso directory di sistema di file. Prima di salvare voglio verificare se esiste la directory di salvataggio specificata. Tuttavia il controllo dell'esistenza non sembra funzionare nel modo che volevo. Senza rimuovere la clausola if, le directory desiderate non vengono create. Mi sono imbattuto in questa interessante domanda di stack durante la ricerca del mio problema. Alternative to File.exists() in Java. Come ho capito java.io ha questo problema.

Esiste un modo corretto e sicuro per verificare l'esistenza di una directory o di una risorsa durante l'esecuzione di operazioni sui file?

+0

Un po 'estraneo, ma se si sta facendo attenzione a questo, si dovrebbe probabilmente controllare anche 'isDirectory()'. – Kevin

risposta

6

Bene, anche se il controllo sarebbe corretto, non si può mai essere sicuri che la directory esiste ancora dopo il if condizione è stata valutata. Un altro processo o utente può semplicemente crearlo/rimuoverlo. Quindi è necessario verificare se l'operazione fallisce (probabilmente recuperando l'eccezione appropriata) comunque.

Quindi non dovresti fare affidamento sugli assegni e aspettarti sempre il caso peggiore. (Beh, le verifiche possono essere utile per voi impedisce di fare qualcosa di inutile, o per chiedere conferma all'utente ecc, ma non lo fanno garanzia nulla.)

+0

Grazie per la risposta. Il resto del codice avvia l'operazione di salvataggio dei file con il flusso di input e di output, quindi necessario per gestire o lanciare IOException. Ma ancora non voglio il mio codice per provare a chiamare un metodo di creazione di directory per uno esistente. – fgakk

+0

@fga: beh, se la directory appare improvvisamente/scompare, c'è comunque qualcosa di sbagliato in corso. Il tuo codice dovrebbe comportarsi correttamente e non dovrebbe essere lanciato se tutto va bene - ma devi elaborare l'eccezione per il caso in cui qualcosa va _wrong_. Quindi va bene controllare se la directory esiste, perché funzionerebbe nel normale flusso di lavoro. Ma poiché questo controllo non è affidabile, non puoi dire che non puoi dire che l'eccezione non verrà lanciata. – Vlad

27
new File(dir).getCanonicalFile().isDirectory(); 

Skeleton per il vostro riferimento: -

File f = new File("...."); 
if (!f.exists()) { 
    // The directory does not exist. 
    ... 
} else if (!f.isDirectory()) { 
    // It is not a directory (i.e. it is a file). 
    ... 
} 
+4

Ancora un'altra istanza della risposta con più voti utili, piuttosto che la risposta accettata. – Amala

0

FileChannel.lock() fa proprio ciò che si vuole il più a lungo non è un altro thread nella JVM che sta eliminando la directory mentre stai usando. Questa cosa richiede un blocco del sistema operativo su un file/cartella per conto del processo JVM, quindi mentre altri processi non saranno in grado di accedere a quella directory, i thread nel JVM possibile.

1

Basta effettuare la chiamata a mkdirs. Non sovrascriverà le directory esistenti quindi, davvero, il tuo controllo non è necessario (e in ogni caso, inaffidabile).

Problemi correlati