So überprüfen Sie, ob ein Ordner vorhanden ist

199

Ich spiele ein bisschen mit den neuen Java 7 IO-Funktionen, eigentlich versuche ich, alle XML-Dateien eines Ordners zu empfangen. Dies löst jedoch eine Ausnahme aus, wenn der Ordner nicht vorhanden ist. Wie kann ich überprüfen, ob der Ordner mit dem neuen E / A vorhanden ist?

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());
    }


}
Al Phaba
quelle
2
Ich frage mich, warum Sie überprüfen möchten, ob der Ordner existiert. Nur weil der Ordner beim Aktivieren vorhanden ist, bedeutet dies nicht, dass der Ordner beim Erstellen des Ordners vorhanden ist DirectoryStream, geschweige denn, wenn Sie die Ordnereinträge durchlaufen.
Oswald
Mögliches Duplikat der neuen Java 7-E
A-

Antworten:

262

Verwenden von java.nio.file.Files:

Path path = ...;

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

Sie können diese Methodenwerte optional übergeben LinkOption:

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

Es gibt auch eine Methode notExists:

if (Files.notExists(path)) {
Jesper
quelle
30
Beachten Sie auch, dass beide Files.exists(path)und Files.notExists(path)gleichzeitig false zurückgeben können! Dies bedeutet, dass Java nicht feststellen konnte, ob der Pfad tatsächlich vorhanden ist.
Sanchit
O_O @Sanchit hast du ein starkes Argument, um es zu sagen?
Richard
6
Die Dokumentation sagt es. :) link Überprüfen Sie, ob die notExists-Methode sie nicht richtig verknüpfen kann.
Sanchit
13
Files.isDirectory (Path, LinkOption);
Kanagavelu Sugumar
2
@ LoMaPh !Files.exists(path)und Files.notExists(path)sind nicht 100% das gleiche. Wenn Java nicht feststellen kann, ob eine Datei vorhanden ist, wird die erste trueund die zweite Datei zurückgegeben false.
Jesper
205

Ziemlich einfach:

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

Und wenn Sie sicher sein wollen, ist es ein Verzeichnis:

File f = new File("/Path/To/File/or/Directory");
if (f.exists() && f.isDirectory()) {
   ...
}
Chris Cooper
quelle
40
richtige Antwort, aber ein kleiner Hinweis: if(f.isDirectory()) {...}würde ausreichen, da es auch die Existenz prüft.
G. Demecki
3
Dies beantwortet nicht die Frage des OP. java.io.fileist nicht Teil der "neuen Java 7 IO-Funktionen", auf die sich das OP bezieht. Das java.nio.filein Java 7 eingeführte Paket bietet die Klassen Pathsund Files. Andere Antworten hier erklären richtig, wie diese neueren Klassen verwendet werden, um das OP-Problem zu lösen.
Doron Gold
53

So überprüfen Sie, ob ein Verzeichnis mit dem neuen E / A vorhanden ist:

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

isDirectoryGibt zurück, truewenn die Datei ein Verzeichnis ist. falseWenn die Datei nicht vorhanden ist, kein Verzeichnis ist oder nicht festgestellt werden kann, ob es sich bei der Datei um ein Verzeichnis handelt oder nicht.

Siehe: Dokumentation .

Fernando Correia
quelle
6

Sie müssen Ihren Pfad in einen verwandeln Fileund auf Existenz prüfen:

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

Generieren Sie eine Datei aus der Zeichenfolge Ihres Ordnerverzeichnisses

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

und Verwendungsmethode existieren.
Wenn Sie den Ordner generieren möchten, sollten Sie mkdir () verwenden.

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

Die exists()Methode muss nicht separat aufgerufen werden, da isDirectory()implizit geprüft wird, ob das Verzeichnis vorhanden ist oder nicht.

Kanbagoly
quelle
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;
  }

}
Nadhu
quelle
1
File sourceLoc=new File("/a/b/c/folderName");
boolean isFolderExisted=false;
sourceLoc.exists()==true?sourceLoc.isDirectory()==true?isFolderExisted=true:isFolderExisted=false:isFolderExisted=false;
Arun Kumar Mudraboyina
quelle
sourceLoc.isDirectory () gibt ein boolesches Ergebnis zurück. Keine Verwendung "sourceLoc.isDirectory () == true"
Oleg Ushakov
1

Wir können Dateien und drei Ordner überprüfen.

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      
        }
    }
}
Akib Bagwan
quelle
Scheint nicht mit einer freigegebenen Netzwerkdatei zu funktionieren. Gefangen: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Objekt 'Z: \\ tierWe bServices \ Deploy \ new.txt' kann nicht mit der Klasse 'org.codehaus.groovy.runtime.GStringImpl' in die Klasse 'java.nio umgewandelt werden .fi le.Path 'org.codehaus.groovy.runtime.typehandling.GroovyCastException: Das Objekt' Z: \\ tierWebService s \ Deploy \ new.txt 'mit der Klasse' org.codehaus.groovy.runtime.GStringImpl 'kann nicht in die Klasse umgewandelt werden 'java.nio.file.Path'
Jirong Hu
0

Von SonarLint , wenn Sie bereits den Pfad haben, verwenden Sie path.toFile().exists()statt Files.existsfür eine bessere Leistung.

Die Files.existsMethode weist in JDK 8 eine merklich schlechte Leistung auf und kann eine Anwendung erheblich verlangsamen, wenn sie zum Überprüfen von Dateien verwendet wird, die tatsächlich nicht vorhanden sind.

Das gleiche gilt für Files.notExists, Files.isDirectoryund Files.isRegularFile.

Beispiel für nicht konformen Code:

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

Konforme Lösung:

Path myPath;
if(myPath.toFile().exists())) {
    // do something
}
MasterHD
quelle