Sprawdź, czy ścieżka reprezentuje plik lub folder


141

Potrzebuję prawidłowej metody, aby sprawdzić, czy a Stringreprezentuje ścieżkę do pliku lub katalogu. Jakie są prawidłowe nazwy katalogów w systemie Android? Jak się okazuje, nazwy folderów mogą zawierać '.'znaki, więc jak system rozumie, czy istnieje plik czy folder?


2
„W jaki sposób system rozpoznaje, czy istnieje plik czy folder”: Jak system może nie rozumieć? Znajduje się na dysku w systemie plików i jest jednym lub drugim.
— Markiz Lorne

Odpowiedzi:


203

Zakładając, że pathjest twój 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

Zobacz FileJavadoc


Lub możesz skorzystać z klasy NIO Filesi sprawdzić takie rzeczy:

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

Jak wspomniałem w swoim pytaniu, mam tylko ciągi znaków i nie mam instancji File i nie mogę ich utworzyć.
— Egor

1
pathw moim przykładzie jest String. Dlaczego nie możesz utworzyć Fileinstancji? Zauważ, że nie zmieni to niczego w systemie plików.
— Baz

Oto konkretny przykład, próbuję utworzyć plik przy użyciu następującej ścieżki: / mnt / sdcard / arc / root, a dla isDirectory () zwraca false. O co tu chodzi?
— Egor

@Egor Dość trudno powiedzieć, ponieważ nie mam urządzenia z Androidem. Zauważ, że rootmoże to być plik. Pliki nie muszą mieć .somethingrozszerzenia.
— Baz

10
Metoda isDirectory () zwróci wartość true tylko wtedy, gdy plik istnieje i jest katalogiem. Jeśli plik podany w ścieżce nie istnieje, to również zwróci false. Więc isDirectory () zwróci false, jeśli podana ścieżka nie istnieje lub istnieje, ale nie jest katalogiem ... Mam nadzieję, że to pomoże ..
— Praful Bhatnagar

50

Czyste rozwiązanie pozostając przy nio API:

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

To lepsza odpowiedź, jeśli przeglądasz listę katalogów. Tutaj używasz klasy statycznej do uruchamiania tych testów, zamiast tworzenia za Filekażdym razem nowego obiektu. Oszczędza pamięć
— Kervvv

2
Nie odpowiada na zadane pytanie. Files.isDirectory () nie akceptuje ciągu.
— gerardw

21

Proszę trzymać się interfejsu API nio, aby przeprowadzić te testy

import java.nio.file.*;

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

2
Po co udzielać odpowiedzi w Scali, kiedy pytanie dotyczy kodu Java (zobacz tagi)?
— Baz

6
@Baz Ponieważ Scala jest kowariantna w stosunku do Javy ... tylko żartuję :-D. Zaktualizowałem odpowiedź.
— Sheng

Możesz stworzyć katalog tymczasowy, stworzyć tam katalogi i pliki. Następnie użyj powyższego kodu i potwierdź. Z jednej strony użyj zwykłych plików / katalogów, w przeciwnym razie użyj fałszywej ścieżki do elementu, który nie został utworzony.
— Gondri,


3

Nie ma sposobu, aby system powiedzieć, czy Stringreprezentuję filelub directory, jeżeli nie istnieje w systemie plików. Na przykład:

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

I na poniższy przykład:

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

Widzimy więc, że w obu przypadkach system zwrócił fałsz. Dotyczy to obu java.io.Fileijava.nio.file.Path


2

Aby sprawdzić, czy ciąg reprezentuje ścieżkę lub plik programowo, należy użyć metod API, takich jak isFile(), isDirectory().

W jaki sposób system rozpoznaje, czy istnieje plik czy folder?

Wydaje mi się, że wpisy plików i folderów są przechowywane w strukturze danych i są zarządzane przez system plików.


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();
}

Aby odpowiedzieć bezpośrednio na pytanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.