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");
minil
źródło
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.

Dave Newton
źródło
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ć.

Surasin Tancharoen
źródło
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();
Ishan Liyanage
źródło
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
neves
źródło
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));
}
Fedir Tsapana
źródło
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();
Crni03
źródło
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);
}
Peter S.
źródło
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

yamenk
źródło
0
    //get the parentfolder name
    File file = new File( System.getProperty("user.dir") + "/.");
    String parentPath = file.getParentFile().getName();
Oscar Betgen
źródło