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.