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


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()имеет значение 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 Это работает только тогда, когда файл был создан с родительским файлом, хотя, как я предполагаю, относительно редко.
Дэйв Ньютон,


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();

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.