Перевірте, чи шлях представляє файл чи папку


141

Мені потрібен правильний метод, щоб перевірити, чи Stringпредставляє собою шлях до файлу чи каталогу. Які дійсні імена каталогів в Android? Як виходить, імена папок можуть містити '.'символи, то як система розуміє, чи є файл чи папка?


2
"Як система розуміє, чи є файл чи папка": Як система не може зрозуміти? Це там на диску у файловій системі, і це те чи інше.
Маркіз Лорн

Відповіді:


203

Припустимо, 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екземпляр? Зауважте, що це нічого не змінить у файловій системі.
Баз

Ось конкретний приклад, я намагаюся створити файл за допомогою наступного шляху: / mnt / sdcard / arc / root, а для isDirectory () він повертає false. У чому тут питання?
Єгор

@Egor Досить важко сказати, оскільки у мене немає пристрою Android. Зверніть увагу, що це rootможе бути файл. Файли не обов'язково мають .somethingрозширення.
Баз

10
Метод isDirectory () повертає true лише в тому випадку, якщо файл існує і це каталог. Якщо файл, вказаний у шляху, не існує, то він також повертає значення false. Отже, цеDirectory () поверне помилкове значення, якщо вказаний шлях не існує або він існує, але це не каталог ... Надія, яка допомагає ..
Молитовний Bhatnagar

50

Чистий розчин під час перебування з API nio:

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

Це краща відповідь, якщо ви перебираєте список каталогів. Тут ви використовуєте статичний клас для запуску цих перевірок, а не Fileщоразу створювати новий об’єкт. Зберігає пам’ять
Керввв

2
Не відповідає на поставлене запитання. 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 (див. Теги)?
Баз

6
@Baz Оскільки Scala є коваріантною для Java ... просто жартує :-D. Я оновив відповідь.
Шен

Ви можете створити тимчасовий каталог, створити там каталоги та файли. Потім скористайтеся кодом вище та затвердіть. В одній руці використовуйте звичайні файли / каталоги, інакше використовуйте деякий фіктивний шлях елемента, який не створюється.
Гондрі


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

Отже, ми бачимо, що в обох випадках система повернення помилковою. Це справедливо і для, 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.