Як отримати лише ім'я батьківського каталогу певного файлу


111

Як дістатися dddз назви шляху, де проживає test.java.

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

1
Це для загального файлу чи ви намагаєтесь отримати батьківський каталог вихідного файлу? Якщо остання, я не впевнений, що ви розумієте компіляцію Java. На час виконання, test.javaймовірно, не буде навіть на комп’ютері, на якому запущена програма. Це компільований .classфайл, який запускається. Тож це спрацює лише в тому випадку, якщо ви знаєте, де dddзнаходиться, і в цьому випадку немає сенсу його шукати програмно; просто жорсткий код.
Марк Петерс

Відповіді:


141

Використовуйте File«s getParentFile()метод і String.lastIndexOf()отримати тільки безпосередній батьківський каталог.

Коментар Марка - краще рішення, ніж lastIndexOf():

file.getParentFile().getName();

Ці рішення працюють лише у тому випадку, якщо у файлу є батьківський файл (наприклад, створений за допомогою одного з конструкторів файлів, що приймають батьківський File). Коли getParentFile()це недійсне, вам потрібно вдатися до використання lastIndexOfабо використовувати щось на кшталт Apache Commons 'FileNameUtils.getFullPath() :

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

Існує кілька варіантів збереження / скидання префікса та розділювача. Ви можете використовувати той же FilenameUtilsклас, щоб схопити ім'я з результату, використовувати lastIndexOfтощо.


14
Вам не потрібно lastIndexOf, просто використовуйте file.getParentFile().getName().
Марк Петерс

13
Про всяк випадок. Якщо він повертається null(якщо ви створили Fileекземпляр з відносним шляхом) - спробуйте file.getAbsoluteFile().getParentFile().getName().
nidu

1
@MarkPeters Це працює лише тоді, коли файл був створений з батьківським файлом, однак, я думаю, це порівняно рідко.
Дейв Ньютон

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

f.getParentFile() може бути недійсним, тому вам слід це перевірити.


1
Щоб переконатися, результат такий: C: / aaa / bbb / ccc / ddd
Гай Аврахам

16

Використовуйте нижче,

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

Варто зазначити, що цей метод повинен мати батьківський набір, навіть якщо базовий файл цього не робив.
Темп

13

У Java 7 у вас є новий api Paths . Сучасне та найчистіше рішення:

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

Результатом буде:

C:/aaa/bbb/ccc/ddd

5

Якщо у вас тільки шлях String і не хочете створювати новий об'єкт File, ви можете використовувати щось на зразок:

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
Це кидає ArrayOutOfBoundsException, якщо ви вже знаходитесь у кореневому розташуванні - "/" -
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"

якщо вам потрібно додати папку "ddd" іншим використанням шляху;

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

1

Від Java 7 я вважаю за краще використовувати шлях. Вам потрібно лише прокласти шлях:

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

і створити метод get:

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

0

У Groovy:

Немає необхідності створювати Fileекземпляр для розбору рядка в groovy. Це можна зробити так:

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

Розділення створить масив, [C:, aaa, bbb, ccc, ddd, test.java]а індекс -2вкаже на запис до останнього, який у цьому випадку єddd


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.