2011-11-03 19 views
6

Kod:Czy istnieje właściwy sposób sprawdzenia istnienia pliku/katalogu w Javie?

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

Ta część kodu służy do zapisywania plików z danej ścieżki do katalogu systemu plików. Przed zapisaniem chcę sprawdzić, czy dany katalog zapisu istnieje. Jednak kontrola istnienia nie wydaje się działać tak, jak chciałem. Bez usuwania klauzuli if żądane katalogi nie są tworzone. Podczas wyszukiwania mojego problemu natrafiłem na to interesujące pytanie dotyczące stosu. Alternative to File.exists() in Java. Jak rozumiem, java.io ma ten problem.

Czy istnieje właściwy i bezpieczny sposób sprawdzania istnienia katalogu lub zasobu podczas wykonywania operacji na plikach?

+0

Trochę niepowiązanych, ale tak długo, jak jesteś ostrożny, powinieneś prawdopodobnie sprawdzić również 'isDirectory()'. – Kevin

Odpowiedz

6

Cóż, nawet jeśli kontrola byłaby poprawna, nigdy nie mogą być pewni, że katalog istnieje nadal poif warunek został ocenione. Inny proces lub użytkownik może go po prostu utworzyć/usunąć. Musisz więc sprawdzić, czy operacja nie powiedzie się (w każdym razie, przechwytując odpowiedni wyjątek).

Nie powinieneś więc polegać na czekach i zawsze oczekiwać najgorszego przypadku. (Dobrze sprawdza może być użyteczne dla uniemożliwia robi coś niepotrzebnego, lub prosząc użytkownika o potwierdzenie itp Ale nie gwarancja czegokolwiek.)

+0

Dziękuję za odpowiedź. Reszta kodu inicjuje operację zapisu pliku ze strumieniem wejściowym i wyjściowym, w związku z czym konieczne jest obsłużenie lub odrzucenie wyjątku IOException. Ale nadal nie chcę, aby mój kod próbował wywołać metodę tworzenia katalogu dla istniejącej. – fgakk

+0

@fga: cóż, jeśli katalog nagle pojawi się/znika, to dzieje się coś złego. Twój kod powinien zachowywać się poprawnie i nie powinien się wyrzucać, jeśli wszystko pójdzie dobrze - ale musisz przetworzyć wyjątek dla sprawy, gdy coś pójdzie nie tak. Można sprawdzić, czy katalog istnieje, ponieważ działałby w normalnym przepływie pracy. Ale ponieważ ta kontrola nie jest wiarygodna, nie możesz powiedzieć, że nie możesz powiedzieć, że wyjątek nie zostanie odrzucony. – Vlad

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

szkielet dla odniesienia: -

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

Jeszcze jedna instancja odpowiedzi z większą liczbą głosów, a nie zaakceptowaną odpowiedzią. – Amala

0

FileChannel.lock() robi tylko to, co chcesz, tak długo, jak to nie jest kolejny wątek w JVM, który usuwa katalog, gdy używasz. To wymaga blokady systemu operacyjnego na plik/folder w imieniu procesu JVM, więc podczas gdy inne procesy nie będą miały dostępu do tego katalogu, wątki w JVM może.

1

Wystarczy zadzwonić pod numer mkdirs. Nie spowoduje to zastąpienia istniejących katalogów tak naprawdę, twoje sprawdzenie jest niepotrzebne (aw każdym razie niewiarygodne).

Powiązane problemy