Jak uzyskać tylko nazwę katalogu nadrzędnego określonego pliku


111

Jak uzyskać dddod nazwy ścieżki, w której znajduje się plik test.java.

File file = new File("C:/aaa/bbb/ccc/ddd/test.java");

1
Czy dotyczy to pliku ogólnego, czy próbujesz uzyskać katalog nadrzędny pliku źródłowego? Jeśli to drugie, nie jestem pewien, czy rozumiesz kompilację Java. W czasie wykonywania test.javaprawdopodobnie nawet nie będzie istnieć na komputerze, na którym program jest uruchamiany. To skompilowany .classplik, który jest uruchamiany. Więc to zadziała tylko wtedy, gdy wiesz, gdzie się dddznajduje, w takim przypadku nie ma sensu szukać go programowo; po prostu mocno go zakoduj.
Mark Peters,

Odpowiedzi:


141

Stosowanie File„s getParentFile()metody i String.lastIndexOf()odzyskać tylko natychmiastowe katalogu nadrzędnego.

Komentarz Marka jest lepszym rozwiązaniem niż lastIndexOf():

file.getParentFile().getName();

Te rozwiązania działają tylko wtedy, gdy plik ma plik nadrzędny (np. Utworzony za pomocą jednego z konstruktorów plików biorących udział w programie File). Kiedy getParentFile()jest null, musisz skorzystać z lastIndexOflub użyć czegoś takiego jak Apache Commons 'FileNameUtils.getFullPath() :

FilenameUtils.getFullPathNoEndSeparator(file.getAbsolutePath());
=> C:/aaa/bbb/ccc/ddd

Istnieje kilka wariantów zachowania / usunięcia przedrostka i separatora końcowego. Możesz użyć tej samej FilenameUtilsklasy, aby pobrać nazwę z wyniku, użyć lastIndexOfitp.


14
Nie potrzebujesz lastIndexOf, po prostu użyj file.getParentFile().getName().
Mark Peters

13
W razie czego. Jeśli zwróci null(jeśli utworzyłeś Fileinstancję ze ścieżką względną) - spróbuj file.getAbsoluteFile().getParentFile().getName().
nidu

1
@MarkPeters To działa tylko wtedy, gdy plik został utworzony z plikiem nadrzędnym, co, jak sądzę, jest stosunkowo rzadkie.
Dave Newton

20
File f = new File("C:/aaa/bbb/ccc/ddd/test.java");
System.out.println(f.getParentFile().getName())

f.getParentFile() może mieć wartość null, więc powinieneś to sprawdzić.


1
Dla pewności, wynik wygląda następująco: C: / aaa / bbb / ccc / ddd
Guy Avraham

16

Użyj poniżej,

File file = new File("file/path");
String parentPath = file.getAbsoluteFile().getParent();

Warto zwrócić uwagę, że ta metoda powinna mieć zestaw nadrzędny, nawet jeśli plik bazowy go nie ma.
Tempo

13

W Javie 7 masz nowe API Paths . Nowoczesne i najczystsze rozwiązanie to:

Paths.get("C:/aaa/bbb/ccc/ddd/test.java").getParent().getFileName();

Wynik byłby taki:

C:/aaa/bbb/ccc/ddd

5

Jeśli masz tylko ścieżkę String i nie chcesz tworzyć nowego obiektu File, możesz użyć czegoś takiego:

public static String getParentDirPath(String fileOrDirPath) {
    boolean endsWithSlash = fileOrDirPath.endsWith(File.separator);
    return fileOrDirPath.substring(0, fileOrDirPath.lastIndexOf(File.separatorChar, 
            endsWithSlash ? fileOrDirPath.length() - 2 : fileOrDirPath.length() - 1));
}

4
Powoduje to zgłoszenie wyjątku ArrayOutOfBoundsException, jeśli jesteś już w lokalizacji głównej - „/” -
Jnmgr

2
File file = new File("C:/aaa/bbb/ccc/ddd/test.java");
File curentPath = new File(file.getParent());
//get current path "C:/aaa/bbb/ccc/ddd/"
String currentFolder= currentPath.getName().toString();
//get name of file to string "ddd"

jeśli chcesz dołączyć folder „ddd” inną ścieżką, użyj;

String currentFolder= "/" + currentPath.getName().toString();

1

Z java 7 wolałbym używać Path. Musisz tylko wprowadzić ścieżkę do:

Path dddDirectoryPath = Paths.get("C:/aaa/bbb/ccc/ddd/test.java");

i utwórz metodę get:

public String getLastDirectoryName(Path directoryPath) {
   int nameCount = directoryPath.getNameCount();
   return directoryPath.getName(nameCount - 1);
}

0

W Groovy:

Nie ma potrzeby tworzenia Fileinstancji, aby przeanalizować ciąg w groovy. Można to zrobić w następujący sposób:

String path = "C:/aaa/bbb/ccc/ddd/test.java"
path.split('/')[-2]  // this will return ddd

Podział utworzy tablicę, [C:, aaa, bbb, ccc, ddd, test.java]a indeks -2wskaże wpis przed ostatnim, którym w tym przypadku jestddd


0
    //get the parentfolder name
    File file = new File( System.getProperty("user.dir") + "/.");
    String parentPath = file.getParentFile().getName();
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.