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


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.