Cara mendapatkan nama direktori induk dari file tertentu

111

Cara mendapatkan ddddari nama jalur tempat test.java berada.

File file = new File("C:/aaa/bbb/ccc/ddd/test.java");
minil
sumber
1
Apakah ini untuk file generik, atau Anda mencoba untuk mendapatkan direktori induk dari file sumber Anda? Jika yang terakhir, saya tidak yakin Anda memahami kompilasi Java. Saat runtime, test.javamungkin bahkan tidak akan ada di komputer tempat program dijalankan. Ini adalah .classfile terkompilasi yang dijalankan. Jadi ini hanya akan berfungsi jika Anda tahu di mana dddlokasinya, dalam hal ini tidak ada gunanya menemukannya secara terprogram; hanya kode keras itu.
Mark Peters

Jawaban:

141

Gunakan File's getParentFile()metode dan String.lastIndexOf()untuk mengambil hanya direktori induk langsung.

Komentar Mark adalah solusi yang lebih baik daripada lastIndexOf():

file.getParentFile().getName();

Solusi ini hanya berfungsi jika file memiliki file induk (misalnya, dibuat melalui salah satu konstruktor file yang mengambil induk File). Kapan getParentFile()nol Anda harus menggunakan lastIndexOf, atau menggunakan sesuatu seperti Apache Commons 'FileNameUtils.getFullPath() :

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

Ada beberapa varian untuk mempertahankan / melepaskan awalan dan pemisah akhir. Anda dapat menggunakan FilenameUtilskelas yang sama untuk mengambil nama dari hasil, penggunaan lastIndexOf, dll.

Dave Newton
sumber
14
Anda tidak perlu lastIndexOf, gunakan saja file.getParentFile().getName().
Mark Peters
13
Untuk berjaga-jaga. Jika kembali null(jika Anda membuat Fileinstance dengan jalur relatif) - coba file.getAbsoluteFile().getParentFile().getName().
nidu
1
@MarkPeters Itu hanya berfungsi ketika file dibuat dengan File induk, yang saya tebak relatif jarang.
Dave Newton
20
File f = new File("C:/aaa/bbb/ccc/ddd/test.java");
System.out.println(f.getParentFile().getName())

f.getParentFile() bisa jadi nol, jadi Anda harus memeriksanya.

Surasin Tancharoen
sumber
1
Hanya untuk memastikan, hasilnya adalah sebagai berikut: C: / aaa / bbb / ccc / ddd
Guy Avraham
16

Gunakan di bawah ini,

File file = new File("file/path");
String parentPath = file.getAbsoluteFile().getParent();
Ishan Liyanage
sumber
Perlu diperhatikan bahwa metode ini harus memiliki kumpulan induk, meskipun file yang mendasarinya tidak.
Laju
13

Di Java 7 Anda memiliki api Paths baru . Solusi modern dan terbersih adalah:

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

Hasilnya adalah:

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

Jika Anda hanya memiliki jalur String dan tidak ingin membuat objek File baru, Anda dapat menggunakan sesuatu seperti:

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
sumber
4
Ini memunculkan ArrayOutOfBoundsException jika Anda sudah berada di lokasi root - "/" -
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"

jika Anda perlu menambahkan folder "ddd" dengan jalur lain, gunakan;

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

Dari java 7 saya lebih suka menggunakan Path. Anda hanya perlu memasukkan jalur ke:

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

dan buat beberapa metode get:

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

Di Groovy:

Tidak perlu membuat Fileinstance untuk mengurai string secara groovy. Itu dapat dilakukan sebagai berikut:

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

Pemisahan akan membuat larik [C:, aaa, bbb, ccc, ddd, test.java]dan indeks -2akan mengarah ke entri sebelum yang terakhir, yang dalam hal ini adalahddd

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