Як перевірити, чи існує папка


199

Я трохи граю з новими функціями IO Java 7, насправді я намагаюся отримувати всі файли xml папки. Але це кидає виняток, коли папки не існує, як я можу перевірити, чи існує папка з новим 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
Цікаво, чому ви хочете перевірити, чи існує папка. Тільки тому, що папка існує під час перевірки, не означає, що папка існує під час створення DirectoryStream, не кажучи вже про те, коли ви повторюєте записи в папці.
Освальд

можливий дублікат Java 7 нового IO API - Paths.exists
Mr_and_Mrs_D

Відповіді:


262

Використання java.nio.file.Files:

Path path = ...;

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

Ви можете додатково передавати LinkOptionзначення цього методу :

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

Існує також метод notExists:

if (Files.notExists(path)) {

30
Також зауважте, що і те, Files.exists(path)і інше Files.notExists(path)може повернути помилкове одночасно! Це означає, що Java не змогла визначити, чи існує шлях насправді.
Санчіт

O_O @Sanchit у вас є сильний аргумент, щоб сказати це?
Річард

6
Документація говорить так. :) посилання Перевірте метод notExists не може насправді пов’язати його належним чином.
Санчіт

13
Files.isDirectory (Шлях, LinkOption);
Канагавелу Сугумар

2
@LoMaPh !Files.exists(path)і Files.notExists(path)не на 100% одне і те ж. Коли Java не може визначити, чи існує файл, перший повернеться, trueа другий повернеться false.
Jesper

205

Досить просто:

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

І якщо ви хочете бути впевненими, це каталог:

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

40
правильна відповідь, але невелике зауваження: if(f.isDirectory()) {...}було б достатньо, оскільки це перевіряє також існування.
Г. Демецький

3
Це не відповідає на питання ОП. java.io.fileне є частиною "нових функцій IO Java 7", на які посилається ОП. java.nio.fileПакет, який був введений в Java 7, пропонує Pathsі Filesкласи. Інші відповіді тут правильно пояснюють, як використовувати ці нові класи для вирішення проблеми ОП.
Дорон Голд

53

Щоб перевірити, чи існує каталог з новим IO:

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

isDirectoryповертається, trueякщо файл є каталогом; falseякщо файл не існує, це не каталог, або його неможливо визначити, чи файл - це каталог чи ні.

Див.: Документація .


6

Вам потрібно перетворити свій Шлях у Fileтест на наявність:

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

5

Створіть файл із рядка каталогу папок

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

і метод використання існує.
Якщо ви хочете створити папку, ви можете використовувати mkdir ()

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

4

Немає необхідності окремо викликати exists()метод, оскільки isDirectory()неявно перевіряється, чи існує каталог чи ні.


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 () повертає бульний результат. Не потрібно використовувати "sourceLoc.isDirectory () == true"
Олег Ушаков

1

Ми можемо перевірити файли та папки папок.

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      
        }
    }
}

Здається, не працює з мережевим спільним файлом. Зловив: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Неможливо видати об’єкт 'Z: \\ tierWe bServices \ Deploy \ new.txt' з класом 'org.codehaus.groovy.runtime.GStringImpl' до класу 'java.nio .fi le.Path 'org.codehaus.groovy.runtime.typehandling.GroovyCastException: Не можна передавати об’єкт' Z: \\ tierWebService s \ Deploy \ new.txt 'з класом' org.codehaus.groovy.runtime.GStringImpl 'до класу 'java.nio.file.Path'
Jirong Hu

0

Якщо ви вже маєте шлях від SonarLint , використовуйте path.toFile().exists()замість Files.existsкращої продуктивності.

Files.existsМетод має помітно погану продуктивність в JDK 8, і може сповільнити додаток значно , коли використовується для перевірки файлів , які на насправді не існує.

Те ж саме Files.notExists, Files.isDirectoryі Files.isRegularFile.

Приклад невідповідного коду:

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

Сумісне рішення:

Path myPath;
if(myPath.toFile().exists())) {
    // do something
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.