Comment vérifier si un dossier existe

199

Je joue un peu avec les nouvelles fonctionnalités Java 7 IO, en fait j'essaie de recevoir tous les fichiers xml d'un dossier. Mais cela lève une exception lorsque le dossier n'existe pas, comment puis-je vérifier si le dossier existe avec le nouvel 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());
    }


}
Al Phaba
la source
2
Je me demande pourquoi vous voudriez vérifier si le dossier existe. Ce n'est pas parce que le dossier existe lorsque vous avez coché que le dossier existe lorsque vous créez le DirectoryStream, et encore moins lorsque vous parcourez les entrées du dossier.
Oswald
doublon possible de la nouvelle API IO Java 7 - Paths.exists
Mr_and_Mrs_D

Réponses:

262

En utilisant java.nio.file.Files:

Path path = ...;

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

Vous pouvez éventuellement transmettre les LinkOptionvaleurs de cette méthode :

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

Il y a aussi une méthode notExists:

if (Files.notExists(path)) {
Jesper
la source
30
Notez également que les deux Files.exists(path)et Files.notExists(path)peuvent renvoyer false en même temps! Cela signifie que Java n'a pas pu déterminer si le chemin existe réellement.
Sanchit
O_O @Sanchit avez-vous des arguments solides pour le dire?
Richard
6
La documentation le dit. :) link Vérifiez que la méthode notExists ne peut pas vraiment la lier correctement.
Sanchit
13
Files.isDirectory (Path, LinkOption);
Kanagavelu Sugumar
2
@LoMaPh !Files.exists(path)et ce Files.notExists(path)n'est pas 100% la même chose. Lorsque Java ne peut pas déterminer si un fichier existe, le premier reviendra trueet le second reviendra false.
Jesper
205

Assez facile:

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

Et si vous voulez être certain que c'est un répertoire:

File f = new File("/Path/To/File/or/Directory");
if (f.exists() && f.isDirectory()) {
   ...
}
Chris Cooper
la source
40
bonne réponse, mais un petit avis: if(f.isDirectory()) {...}serait suffisant, car il vérifie également l'existence.
G. Demecki
3
Cela ne répond pas à la question du PO. java.io.filene fait pas partie des "nouvelles fonctionnalités Java 7 IO" auxquelles l'OP fait référence. Le java.nio.filepackage, qui a été introduit dans Java 7, propose les classes Pathset Files. D'autres réponses ici expliquent correctement comment utiliser ces classes plus récentes pour résoudre le problème des OP.
Doron Gold
53

Pour vérifier si un répertoire existe avec le nouvel IO:

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

isDirectoryrenvoie truesi le fichier est un répertoire; falsesi le fichier n'existe pas, n'est pas un répertoire, ou il ne peut pas être déterminé si le fichier est un répertoire ou non.

Voir: documentation .

Fernando Correia
la source
6

Vous devez transformer votre chemin en un Fileet tester son existence:

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

Générez un fichier à partir de la chaîne de votre répertoire de dossiers

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

et la méthode d'utilisation existent.
Si vous souhaitez générer le dossier, vous devez utiliser mkdir ()

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

Il n'est pas nécessaire d'appeler séparément la exists()méthode, car elle isDirectory()vérifie implicitement si le répertoire existe ou non.

kanbagoly
la source
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
la source
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
la source
sourceLoc.isDirectory () renvoie un résultat booléen. Pas besoin d'utiliser "sourceLoc.isDirectory () == true"
Oleg Ushakov
1

Nous pouvons vérifier les fichiers et leurs dossiers.

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
la source
Semble ne pas fonctionner avec un fichier partagé en réseau. Pris: org.codehaus.groovy.runtime.typehandling.GroovyCastException: impossible de caster l'objet 'Z: \\ tierWe bServices \ Deploy \ new.txt' avec la classe 'org.codehaus.groovy.runtime.GStringImpl' en classe 'java.nio .fi le.Path 'org.codehaus.groovy.runtime.typehandling.GroovyCastException: impossible de caster l'objet' Z: \\ tierWebService s \ Deploy \ new.txt 'avec la classe' org.codehaus.groovy.runtime.GStringImpl 'en classe 'java.nio.file.Path'
Jirong Hu
0

Depuis SonarLint , si vous avez déjà le chemin, utilisez path.toFile().exists()plutôt que Files.existspour de meilleures performances.

La Files.existsméthode a des performances sensiblement médiocres dans JDK 8 et peut ralentir considérablement une application lorsqu'elle est utilisée pour vérifier des fichiers qui n'existent pas réellement.

Il en va de même pour Files.notExists, Files.isDirectoryet Files.isRegularFile.

Exemple de code non conforme:

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

Solution conforme:

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