Jak sprawdzić, czy folder istnieje


199

Gram trochę z nowymi funkcjami IO Java 7, właściwie próbuję odebrać wszystkie pliki xml folderu. Ale to generuje wyjątek, gdy folder nie istnieje, jak mogę sprawdzić, czy folder istnieje z nowym IO?

public UpdateHandler(String release) {
    log.info("searching for configuration files in folder " + release);
    Path releaseFolder = Paths.get(release);
    try(DirectoryStream<Path> stream = Files.newDirectoryStream(releaseFolder, "*.xml")){

        for (Path entry: stream){
            log.info("working on file " + entry.getFileName());
        }
    }
    catch (IOException e){
        log.error("error while retrieving update configuration files " + e.getMessage());
    }


}

2
Zastanawiam się, dlaczego chcesz sprawdzić, czy folder istnieje. To, że folder istnieje podczas sprawdzania, nie oznacza, że ​​folder istnieje podczas tworzenia DirectoryStream, nie mówiąc już o iteracji po pozycjach folderu.
Oswald

Odpowiedzi:


262

Używanie java.nio.file.Files:

Path path = ...;

if (Files.exists(path)) {
    // ...
}

Opcjonalnie możesz przekazać LinkOptionwartości tej metody :

if (Files.exists(path, LinkOption.NOFOLLOW_LINKS)) {

Istnieje również metoda notExists:

if (Files.notExists(path)) {

30
Należy również pamiętać, że zarówno Files.exists(path)i Files.notExists(path)może return false w tym samym czasie! Oznacza to, że Java nie może ustalić, czy ścieżka rzeczywiście istnieje.
Sanchit

O_O @ Sanchit, czy masz mocny argument, aby to powiedzieć?
Richard

6
Dokumentacja tak mówi. :) link Sprawdź, czy metoda notExists nie może tak naprawdę poprawnie połączyć.
Sanchit

13
Files.isDirectory (Path, LinkOption);
Kanagavelu Sugumar

2
@LoMaPh !Files.exists(path)i Files.notExists(path)nie są w 100% tym samym. Gdy Java nie może ustalić, czy plik istnieje, pierwszy zwróci, truea drugi zwróci false.
Jesper,

205

Całkiem proste:

new File("/Path/To/File/or/Directory").exists();

A jeśli chcesz mieć pewność, że jest to katalog:

File f = new File("/Path/To/File/or/Directory");
if (f.exists() && f.isDirectory()) {
   ...
}

40
prawidłowa odpowiedź, ale drobna uwaga: if(f.isDirectory()) {...}wystarczy, bo sprawdza także istnienie.
G. Demecki

3
To nie odpowiada na pytanie PO. java.io.filenie jest częścią „nowych funkcji IO Java 7”, o których mówi OP. java.nio.filePakiet, który został wprowadzony w Java 7, oferuje Pathsi Filesklas. Inne odpowiedzi tutaj poprawnie wyjaśniają, jak korzystać z tych nowszych klas, aby rozwiązać problem PO.
Doron Gold

53

Aby sprawdzić, czy istnieje katalog z nowym IO:

if (Files.isDirectory(Paths.get("directory"))) {
  ...
}

isDirectoryzwraca, truejeśli plik jest katalogiem; falsejeśli plik nie istnieje, nie jest katalogiem lub nie można ustalić, czy plik jest katalogiem, czy nie.

Zobacz: dokumentacja .


6

Musisz przekształcić swoją Ścieżkę w Filei przetestować istnienie:

for(Path entry: stream){
  if(entry.toFile().exists()){
    log.info("working on file " + entry.getFileName());
  }
}

5

Wygeneruj plik z ciągu katalogu w folderze

String path="Folder directory";    
File file = new File(path);

i istnieje metoda użycia.
Jeśli chcesz wygenerować folder, powinieneś użyć mkdir ()

if (!file.exists()) {
            System.out.print("No Folder");
            file.mkdir();
            System.out.print("Folder created");
        }

4

Nie ma potrzeby osobnego wywoływania exists()metody, ponieważ isDirectory()domyślnie sprawdza, czy katalog istnieje, czy nie.


4
import java.io.File;
import java.nio.file.Paths;

public class Test
{

  public static void main(String[] args)
  {

    File file = new File("C:\\Temp");
    System.out.println("File Folder Exist" + isFileDirectoryExists(file));
    System.out.println("Directory Exists" + isDirectoryExists("C:\\Temp"));

  }

  public static boolean isFileDirectoryExists(File file)

  {
    if (file.exists())
    {
      return true;
    }
    return false;
  }

  public static boolean isDirectoryExists(String directoryPath)

  {
    if (!Paths.get(directoryPath).toFile().isDirectory())
    {
      return false;
    }
    return true;
  }

}

1
File sourceLoc=new File("/a/b/c/folderName");
boolean isFolderExisted=false;
sourceLoc.exists()==true?sourceLoc.isDirectory()==true?isFolderExisted=true:isFolderExisted=false:isFolderExisted=false;

sourceLoc.isDirectory () zwraca wynik logiczny. Nie trzeba używać „sourceLoc.isDirectory () == true”
Oleg Ushakov

1

Możemy sprawdzać pliki i foldery.

import java.io.*;
public class fileCheck
{
    public static void main(String arg[])
    {
        File f = new File("C:/AMD");
        if (f.exists() && f.isDirectory()) {
        System.out.println("Exists");
        //if the file is present then it will show the msg  
        }
        else{
        System.out.println("NOT Exists");
        //if the file is Not present then it will show the msg      
        }
    }
}

Wydaje się, że nie działa z udostępnionym plikiem sieciowym. Złapany: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Nie można rzutować obiektu „Z: \\ tierWe bServices \ Deploy \ new.txt” z klasą „org.codehaus.groovy.runtime.GStringImpl” do klasy java.nio .fi le.Path 'org.codehaus.groovy.runtime.typehandling.GroovyCastException: Nie można rzutować obiektu „Z: \\ tierWebService s \ Deploy \ new.txt” z klasą „org.codehaus.groovy.runtime.GStringImpl” do klasy „java.nio.file.Path”
Jirong Hu

0

Jeśli masz już ścieżkę z SonarLint , użyj path.toFile().exists()zamiast, Files.existsaby uzyskać lepszą wydajność.

Files.existsMetoda ma zauważalnie słabe wyniki w JDK 8, a może spowolnić aplikację znacząco gdy używana do sprawdzania plików, które w rzeczywistości nie istnieją.

To samo dotyczy Files.notExists, Files.isDirectoryi Files.isRegularFile.

Przykład niezgodnego kodu:

Path myPath;
if(java.nio.Files.exists(myPath)) {  // Noncompliant
    // do something
}

Zgodne rozwiązanie:

Path myPath;
if(myPath.toFile().exists())) {
    // do something
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.