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

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.


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.


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

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

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

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

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

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


0
    //get the parentfolder name
    File file = new File( System.getProperty("user.dir") + "/.");
    String parentPath = file.getParentFile().getName();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.