Kiểm tra xem một đường dẫn đại diện cho một tập tin hoặc một thư mục


141

Tôi cần một phương thức hợp lệ để kiểm tra xem Stringmột đường dẫn cho tệp hoặc thư mục. Tên thư mục hợp lệ trong Android là gì? Khi xuất hiện, tên thư mục có thể chứa '.'ký tự, vậy làm thế nào để hệ thống hiểu liệu có tệp hoặc thư mục không?


2
"Làm thế nào để hệ thống hiểu liệu có tệp hoặc thư mục": Làm thế nào hệ thống không thể hiểu? Nó có trên đĩa trong hệ thống tập tin và nó là cái này hay cái khác.
Hầu tước Lorne

Câu trả lời:


203

Giả sử pathlà của bạn String.

File file = new File(path);

boolean exists =      file.exists();      // Check if the file exists
boolean isDirectory = file.isDirectory(); // Check if it's a directory
boolean isFile =      file.isFile();      // Check if it's a regular file

Xem FileJavadoc


Hoặc bạn có thể sử dụng lớp NIO Filesvà kiểm tra những thứ như thế này:

Path file = new File(path).toPath();

boolean exists =      Files.exists(file);        // Check if the file exists
boolean isDirectory = Files.isDirectory(file);   // Check if it's a directory
boolean isFile =      Files.isRegularFile(file); // Check if it's a regular file

Như tôi đã đề cập trong câu hỏi của mình, tôi chỉ có Chuỗi và không có phiên bản Tệp và tôi không thể tạo chúng.
Egor

1
pathtrong ví dụ của tôi là String. Tại sao bạn không thể tạo một Fileví dụ? Lưu ý rằng điều này sẽ không thay đổi bất cứ điều gì trên hệ thống tập tin.
Baz

Đây là một ví dụ cụ thể, tôi đang cố gắng tạo một tệp bằng cách sử dụng đường dẫn sau: / mnt / sdcard / arc / root và đối với isDirectory (), nó trả về false. Vấn đề ở đây là gì?
Egor

@Egor Khá khó để nói, vì tôi không có thiết bị Android. Lưu ý rằng rootcó thể là một tập tin. Các tập tin không nhất thiết phải có một .somethingphần mở rộng.
Baz

10
Phương thức isDirectory () sẽ trả về true chỉ khi tệp tồn tại và nó là một thư mục. Nếu tập tin được đưa ra trong đường dẫn không tồn tại thì nó cũng trả về false. Vì vậy, isDirectory () sẽ trả về false nếu đường dẫn đã cho không tồn tại hoặc nó tồn tại nhưng nó không phải là một thư mục ... Hy vọng điều đó sẽ giúp ..
Praful Bhatnagar

50

Làm sạch giải pháp trong khi vẫn sử dụng API nio:

Files.isDirectory(path)
Files.isRegularFile(path)

Đây là câu trả lời tốt hơn nếu bạn đang lặp qua một danh sách các thư mục. Ở đây bạn đang sử dụng một lớp tĩnh để chạy các kiểm tra này, thay vì tạo một Fileđối tượng mới mỗi lần. Lưu bộ nhớ
Kervvv

2
Không trả lời câu hỏi. Files.isDirectory () không chấp nhận Chuỗi.
gerardw

21

Vui lòng bám vào API nio để thực hiện các kiểm tra này

import java.nio.file.*;

static Boolean isDir(Path path) {
  if (path == null || !Files.exists(path)) return false;
  else return Files.isDirectory(path);
}

2
Tại sao đưa ra câu trả lời trong Scala khi câu hỏi đang yêu cầu mã Java (xem thẻ)?
Baz

6
@Baz Bởi vì Scala là đồng biến với Java ... chỉ đùa thôi :-D. Tôi đã cập nhật câu trả lời.
Sheng

Bạn có thể tạo thư mục tạm thời, tạo thư mục và tập tin. Sau đó sử dụng mã ở trên và khẳng định. Trong một tay, sử dụng các tệp / thư mục thông thường nếu không sử dụng một số đường dẫn giả của mục không được tạo.
Gondri

4
String path = "Your_Path";
File f = new File(path);

if (f.isDirectory()){



  }else if(f.isFile()){



  }

3

Không có cách nào để hệ thống cho bạn biết nếu Stringđại diện cho một filehoặc directory, nếu nó không tồn tại trong hệ thống tệp. Ví dụ:

Path path = Paths.get("/some/path/to/dir");
System.out.println(Files.isDirectory(path)); // return false
System.out.println(Files.isRegularFile(path)); // return false

Và cho ví dụ sau:

Path path = Paths.get("/some/path/to/dir/file.txt");
System.out.println(Files.isDirectory(path));  //return false
System.out.println(Files.isRegularFile(path));  // return false

Vì vậy, chúng tôi thấy rằng trong cả hai trường hợp hệ thống trả về sai. Điều này đúng cho cả hai java.io.Filejava.nio.file.Path


2

Để kiểm tra xem một chuỗi đại diện cho một đường dẫn hoặc một tệp theo chương trình, bạn nên sử dụng các phương thức API như isFile(), isDirectory().

Làm thế nào để hệ thống hiểu liệu có một tập tin hoặc một thư mục?

Tôi đoán, các mục nhập tệp và thư mục được giữ trong một cấu trúc dữ liệu và nó được quản lý bởi hệ thống tệp.


0
   private static boolean isValidFolderPath(String path) {
    File file = new File(path);
    if (!file.exists()) {
      return file.mkdirs();
    }
    return true;
  }

0
public static boolean isDirectory(String path) {
    return path !=null && new File(path).isDirectory();
}

Để trả lời câu hỏi trực tiếp.

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.