So erhalten Sie nur den übergeordneten Verzeichnisnamen einer bestimmten Datei

111

So ermitteln Sie dddden Pfadnamen, in dem sich die Datei test.java befindet.

File file = new File("C:/aaa/bbb/ccc/ddd/test.java");
minil
quelle
1
Ist dies eine generische Datei oder versuchen Sie, das übergeordnete Verzeichnis Ihrer Quelldatei abzurufen? In letzterem Fall bin ich mir nicht sicher, ob Sie die Java-Kompilierung verstehen. Zur Laufzeit ist test.javawahrscheinlich nicht einmal auf dem Computer vorhanden, auf dem das Programm ausgeführt wird. Es ist die kompilierte .classDatei, die ausgeführt wird. Dies funktioniert also nur, wenn Sie wissen, wo dddsich der Standort befindet. In diesem Fall macht es keinen Sinn, ihn programmgesteuert zu finden. nur hart codieren.
Mark Peters

Antworten:

141

Verwenden Sie Filedie getParentFile()Methode von und String.lastIndexOf(), um nur das unmittelbare übergeordnete Verzeichnis abzurufen .

Marks Kommentar ist eine bessere Lösung als lastIndexOf():

file.getParentFile().getName();

Diese Lösungen funktionieren nur, wenn die Datei eine übergeordnete Datei enthält (z. B. erstellt über einen der Dateikonstruktoren, die eine übergeordnete Datei übernehmen File). Wenn getParentFile()null ist, müssen Sie auf die Verwendung von Apache Commons zurückgreifen lastIndexOfoder Folgendes verwendenFileNameUtils.getFullPath() :

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

Es gibt verschiedene Varianten, um das Präfix und das nachfolgende Trennzeichen beizubehalten / zu löschen. Sie können entweder dieselbe FilenameUtilsKlasse verwenden, um den Namen aus dem Ergebnis, der Verwendung lastIndexOfusw. zu ermitteln.

Dave Newton
quelle
14
Sie brauchen nicht lastIndexOf, nur verwenden file.getParentFile().getName().
Mark Peters
13
Nur für den Fall. Wenn es zurückkehrt null(wenn Sie eine FileInstanz mit einem relativen Pfad erstellt haben) - versuchen Sie es file.getAbsoluteFile().getParentFile().getName().
Nidu
1
@MarkPeters Das funktioniert jedoch nur, wenn die Datei mit einer übergeordneten Datei erstellt wurde, was meiner Meinung nach relativ selten vorkommt.
Dave Newton
20
File f = new File("C:/aaa/bbb/ccc/ddd/test.java");
System.out.println(f.getParentFile().getName())

f.getParentFile() kann null sein, also sollten Sie es überprüfen.

Surasin Tancharoen
quelle
1
Nur um sicherzugehen, ist die Ausgabe wie folgt: C: / aaa / bbb / ccc / ddd
Guy Avraham
16

Verwenden Sie unten,

File file = new File("file/path");
String parentPath = file.getAbsoluteFile().getParent();
Ishan Liyanage
quelle
Es sei darauf hingewiesen, dass für diese Methode ein übergeordnetes Element festgelegt werden sollte, auch wenn die zugrunde liegende Datei dies nicht tat.
Pace
13

In Java 7 haben Sie die neue Paths-API . Die moderne und sauberste Lösung ist:

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

Ergebnis wäre:

C:/aaa/bbb/ccc/ddd
neves
quelle
5

Wenn Sie nur einen Zeichenfolgenpfad haben und kein neues Dateiobjekt erstellen möchten, können Sie Folgendes verwenden:

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
quelle
4
Dies löst ArrayOutOfBoundsException aus, wenn Sie sich bereits am Stammspeicherort befinden - "/" -
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"

Wenn Sie den Ordner "ddd" über einen anderen Pfad anhängen müssen, verwenden Sie;

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

Ab Java 7 würde ich lieber Path verwenden. Sie müssen nur den Pfad eingeben in:

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

und erstellen Sie eine get-Methode:

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

In Groovy:

Es ist nicht erforderlich, eine FileInstanz zu erstellen , um den String in Groovy zu analysieren. Dies kann wie folgt erfolgen:

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

Durch die Aufteilung wird das Array erstellt, [C:, aaa, bbb, ccc, ddd, test.java]und der Index -2zeigt auf den Eintrag vor dem letzten, in diesem Fallddd

Yamenk
quelle
0
    //get the parentfolder name
    File file = new File( System.getProperty("user.dir") + "/.");
    String parentPath = file.getParentFile().getName();
Oscar Betgen
quelle