Как проверить, существует ли папка

199

Я немного играю с новыми функциями ввода-вывода 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)) {
Jesper
источник
30
Также обратите внимание, что оба Files.exists(path)и Files.notExists(path)могут возвращать false одновременно! Это означает, что Java не может определить, существует ли путь на самом деле.
Санчит
О_О @ Санчит, у тебя есть веские аргументы, чтобы сказать это?
Ричард
6
В документации так сказано. :) ссылка Проверьте, что метод notExists не может правильно связать его.
Санчит
13
Files.isDirectory (Path, LinkOption);
Канагавелу Сугамар
2
@LoMaPh !Files.exists(path)и Files.notExists(path)не 100% одно и то же. Когда Java не может определить, существует ли файл, первый вернется, trueа второй вернется false.
Джеспер
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не является частью «новых функций ввода-вывода Java 7», на которые ссылается OP. java.nio.fileПакет, который был введен в Java 7, предлагает Pathsи Filesклассы. Другие ответы здесь правильно объясняют, как использовать эти новые классы для решения проблемы OP.
Дорон Голд
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());
  }
}
bvidal
источник
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()неявно проверяет, существует ли каталог или нет.

kanbagoly
источник
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
источник
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'
Джиронг Ху
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
}
MasterHD
источник