Проверьте, представляет ли путь файл или папку


147

Мне нужен действительный метод, чтобы проверить, Stringпредставляет ли a путь к файлу или каталогу. Какие допустимые имена каталогов в Android? Как выяснилось, имена папок могут содержать '.'символы, так как же система понимает, есть ли там файл или папка?


2
«Как система понимает, есть ли файл или папка»: как система может не понимать? Он находится на диске в файловой системе, и это одно из двух.
— Маркиз Лорн,

Ответы:


208

Предполагая, что pathэто ваш 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

См. FileJavadoc


Или вы можете использовать класс NIO Filesи проверять такие вещи:

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

Как я уже упоминал в своем вопросе, у меня есть только строки и нет экземпляров файлов, и я не могу их создавать.
— Егор

1
pathв моем примере это расширение String. Почему вы не можете создать Fileэкземпляр? Обратите внимание, что это ничего не изменит в файловой системе.
— Baz

Вот конкретный пример, я пытаюсь создать файл, используя следующий путь: / mnt / sdcard / arc / root, а для isDirectory () он возвращает false. В чем проблема?
— Егор

@Egor Сложно сказать, у меня нет Android-устройства. Обратите внимание, что это rootможет быть файл. Файлы не обязательно имеют .somethingрасширение.
— Baz

11
Метод isDirectory () вернет true, только если файл существует и является каталогом. Если файл, указанный в пути, не существует, он также возвращает false. Таким образом, isDirectory () вернет false, если указанный путь не существует или существует, но это не каталог ... Надеюсь, что это поможет ..
— Прафул Бхатнагар

51

Чистое решение, оставаясь с API nio:

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

Это лучший ответ, если вы просматриваете список каталогов. Здесь вы используете статический класс для выполнения этих проверок, вместо того, чтобы Fileкаждый раз создавать новый объект. Сохраняет память
— Kervvv 06

4
Не отвечает на заданный вопрос. Files.isDirectory () не принимает String.
— gerardw

21

Для выполнения этих проверок придерживайтесь API nio.

import java.nio.file.*;

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

2
Зачем давать ответ в Scala, когда вопрос касается кода Java (см. Теги)?
— Baz

6
@Baz Потому что Scala ковариантна Java ... шучу :-D. Я обновил ответ.
— Шэн

Вы можете создать временный каталог, создать в нем каталоги и файлы. Затем используйте приведенный выше код и подтвердите. С одной стороны, используйте обычные файлы / каталоги, в противном случае используйте фиктивный путь к элементу, который не создается.
— Gondri


3

Система не может сказать вам, Stringпредставляет ли a fileили directory, если он не существует в файловой системе. Например:

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

И для следующего примера:

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

Итак, мы видим, что в обоих случаях система возвращает false. Это верно как для, так java.io.Fileи дляjava.nio.file.Path


2

Чтобы проверить, представляет ли строка путь или файл программно, вы должны использовать методы API, такие как isFile(), isDirectory().

Как система понимает, есть ли файл или папка?

Я предполагаю, что записи файлов и папок хранятся в структуре данных и управляются файловой системой.



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

Чтобы ответить на вопрос прямо.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.