Làm thế nào để kiểm tra nếu một thư mục tồn tại


199

Tôi đang chơi một chút với các tính năng IO của Java 7 mới, thực sự tôi đang cố gắng nhận tất cả các tệp xml của một thư mục. Nhưng điều này đưa ra một ngoại lệ khi thư mục không tồn tại, làm cách nào để kiểm tra xem thư mục có tồn tại với IO mới không?

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
Tôi tự hỏi tại sao bạn muốn kiểm tra xem thư mục có tồn tại không. Chỉ vì thư mục tồn tại khi bạn kiểm tra không có nghĩa là thư mục tồn tại khi bạn tạo DirectoryStream, hãy để yên khi bạn lặp lại các mục trong thư mục.
Oswald

có thể sao chép API IO mới
Mr_and_Mrs_D 7/07/14

Câu trả lời:


262

Sử dụng java.nio.file.Files:

Path path = ...;

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

Bạn có thể tùy ý chuyển LinkOptioncác giá trị phương thức này :

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

Ngoài ra còn có một phương pháp notExists:

if (Files.notExists(path)) {

30
Ngoài ra, lưu ý rằng cả hai Files.exists(path)Files.notExists(path)có thể trả lại sai cùng một lúc! Điều này có nghĩa là Java không thể xác định liệu đường dẫn có thực sự tồn tại hay không.
Sanchit

O_O @Sanchit bạn có tranh luận mạnh mẽ không?
Richard

6
Các tài liệu nói như vậy. :) liên kết Kiểm tra phương thức notExists thực sự không thể liên kết nó đúng cách.
Sanchit

13
Files.isDirectory (Đường dẫn, LinkOption);
Kanagavelu Sugumar

2
@LoMaPh !Files.exists(path)Files.notExists(path)không giống nhau 100%. Khi Java không thể xác định nếu một tệp tồn tại, tệp đầu tiên sẽ trả về truevà tệp thứ hai sẽ trả về false.
Jesper

205

Khá đơn giản:

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

Và nếu bạn muốn chắc chắn đó là một thư mục:

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

40
câu trả lời đúng, nhưng một thông báo nhỏ: if(f.isDirectory()) {...}sẽ là đủ, vì nó cũng kiểm tra sự tồn tại.
G. Demecki

3
Điều này không trả lời câu hỏi của OP. java.io.filekhông phải là một phần của "các tính năng IO của Java 7 mới" mà OP đang đề cập. Các java.nio.filegói, trong đó đã được giới thiệu trong Java 7, cung cấp PathsFilescác lớp học. Các câu trả lời khác ở đây giải thích chính xác cách sử dụng các lớp mới hơn này để giải quyết vấn đề OP.
Doron Gold

53

Để kiểm tra xem một thư mục có tồn tại với IO mới không:

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

isDirectorytrả về truenếu tập tin là một thư mục; falsenếu tập tin không tồn tại, không phải là một thư mục, hoặc nó không thể được xác định nếu tập tin đó là một thư mục hay không.

Xem: tài liệu .


6

Bạn cần chuyển đổi Đường dẫn của mình thành một Filevà kiểm tra sự tồn tại:

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

5

Tạo một tệp từ chuỗi thư mục thư mục của bạn

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

và sử dụng phương pháp tồn tại.
Nếu bạn muốn tạo thư mục bạn nên sử dụng mkdir ()

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

4

Không cần phải gọi riêng exists()phương thức, vì isDirectory()ngầm kiểm tra xem thư mục có tồn tại hay không.


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 () trả về kết quả boolean. Không cần sử dụng "sourceLoc.isDirectory () == true"
Oleg Ushakov

1

Chúng tôi có thể kiểm tra các tập tin và thư mục thire.

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

Có vẻ như không hoạt động với một tệp chia sẻ mạng. Bị bắt: org.codehaus.groovy.r Yoon.typehandling.GroovyCastException: Không thể truyền đối tượng 'Z: \\ tierwe bService \ Deploy \ new.txt' với lớp 'org.codehaus.groovy.r nb.GStringImpl' sang lớp 'java.nio .fi le.Path 'org.codehaus.groovy.r Yoon.typehandling.GroovyCastException: Không thể truyền đối tượng' Z: \\ tierWebService s \ Deploy \ new.txt 'với lớp' org.codehaus.groovy.r nb.GStringImpl ' 'java.nio.file.Path'
Jirong Hu

0

Từ SonarLint , nếu bạn đã có đường dẫn, hãy sử dụng path.toFile().exists()thay vì Files.existsđể có hiệu suất tốt hơn.

Các Files.existsphương pháp có hiệu suất đáng kể nghèo trong JDK 8, và có thể làm chậm một ứng dụng đáng kể khi được sử dụng để kiểm tra các file mà không thực sự tồn tại.

Điều tương tự cũng xảy ra Files.notExists, Files.isDirectoryFiles.isRegularFile.

Ví dụ về mã không tuân thủ:

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

Giải pháp tuân thủ:

Path myPath;
if(myPath.toFile().exists())) {
    // do something
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.