Как получить только имя родительского каталога определенного файла

111

Как получить dddот имени пути, где находится test.java.

File file = new File("C:/aaa/bbb/ccc/ddd/test.java");
minil
источник
1
Это для общего файла или вы пытаетесь получить родительский каталог исходного файла? Если последнее, я не уверен, что вы понимаете компиляцию Java. Во время выполнения, test.javaвероятно, даже не будет существовать на компьютере, на котором выполняется программа. Запускается скомпилированный .classфайл. Таким образом, это будет работать, только если вы знаете, где dddон находится, и в этом случае нет смысла искать его программно; просто запрограммируйте его.
Марк Петерс

Ответы:

141

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

Комментарий Марка - лучшее решение, чем lastIndexOf():

file.getParentFile().getName();

Эти решения работают только в том случае, если у файла есть родительский файл (например, созданный с помощью одного из конструкторов файлов, принимающих родительский файл File). Когда getParentFile()имеет значение null, вам нужно прибегнуть к использованию lastIndexOfили использовать что-то вроде Apache CommonsFileNameUtils.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
На всякий
Гай Авраам
16

Используйте ниже,

File file = new File("file/path");
String parentPath = file.getAbsoluteFile().getParent();
Ишан Лиянаге
источник
Стоит отметить, что этот метод должен иметь родительский набор, даже если у базового файла его нет.
Pace
13

В Java 7 у вас есть новый API Paths . Самое современное и чистое решение - это:

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

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

C:/aaa/bbb/ccc/ddd
Невиш
источник
5

Если у вас есть только строковый путь и вы не хотите создавать новый объект 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();
Crni03
источник
1

Из java 7 я бы предпочел использовать Path. Вам нужно только ввести путь:

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

и создайте метод получения:

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

yamenk
источник
0
    //get the parentfolder name
    File file = new File( System.getProperty("user.dir") + "/.");
    String parentPath = file.getParentFile().getName();
Оскар Бетген
источник