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


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.