Como obter apenas o nome do diretório pai de um arquivo específico

111

Como obter ddddo nome do caminho onde o test.java reside.

File file = new File("C:/aaa/bbb/ccc/ddd/test.java");
minil
fonte
1
Trata-se de um arquivo genérico ou você está tentando obter o diretório pai do arquivo de origem? Neste último caso, não tenho certeza se você entende a compilação Java. Em tempo de execução, test.javaprovavelmente nem existirá no computador onde o programa está sendo executado. É o .classarquivo compilado que é executado. Portanto, isso só funcionará se você souber onde dddestá localizado; nesse caso, não há motivo para encontrá-lo programaticamente; apenas codifique-o.
Mark Peters

Respostas:

141

Use Fileo getParentFile()método de e String.lastIndexOf()para recuperar apenas o diretório pai imediato.

O comentário de Mark é uma solução melhor do que lastIndexOf():

file.getParentFile().getName();

Essas soluções só funcionam se o arquivo tiver um arquivo pai (por exemplo, criado por meio de um dos construtores de arquivo usando um pai File). Quando getParentFile()for null, você precisará recorrer ao uso lastIndexOf, ou usar algo como o Apache Commons 'FileNameUtils.getFullPath() :

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

Existem várias variantes para reter / eliminar o prefixo e o separador final. Você pode usar a mesma FilenameUtilsclasse para obter o nome do resultado, usar lastIndexOf, etc.

Dave Newton
fonte
14
Você não precisa lastIndexOf, apenas use file.getParentFile().getName().
Mark Peters
13
Apenas no caso de. Se retornar null(se você criou uma Fileinstância com caminho relativo) - tente file.getAbsoluteFile().getParentFile().getName().
nidu
1
@MarkPeters Isso só funciona quando o arquivo foi criado com um arquivo pai, o que eu acho que é relativamente raro.
Dave Newton
20
File f = new File("C:/aaa/bbb/ccc/ddd/test.java");
System.out.println(f.getParentFile().getName())

f.getParentFile() pode ser nulo, então você deve verificar.

Surasin Tancharoen
fonte
1
Só para ter certeza, a saída é a seguinte: C: / aaa / bbb / ccc / ddd
Guy Avraham
16

Use abaixo,

File file = new File("file/path");
String parentPath = file.getAbsoluteFile().getParent();
Ishan Liyanage
fonte
Vale ressaltar que este método deve ter um pai definido, mesmo que o arquivo subjacente não tenha.
Ritmo
13

No Java 7, você tem a nova API Paths . A solução moderna e mais limpa é:

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

O resultado seria:

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

Se você tiver apenas o caminho String e não quiser criar um novo objeto File, poderá usar algo como:

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
fonte
4
Isso gera ArrayOutOfBoundsException se você já estiver no local da raiz - "/" -
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"

se precisar anexar a pasta "ddd" por outro caminho, use;

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

Do java 7, eu preferiria usar o Path. Você só precisa colocar o caminho em:

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

e crie algum método get:

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

Em Groovy:

Não há necessidade de criar uma Fileinstância para analisar a string no groovy. Isso pode ser feito da seguinte forma:

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

A divisão criará a matriz [C:, aaa, bbb, ccc, ddd, test.java]e o índice -2apontará para a entrada antes da última, que neste caso éddd

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