Cómo obtener solo el nombre del directorio principal de un archivo específico

111

Cómo obtener dddel nombre de la ruta donde reside test.java.

File file = new File("C:/aaa/bbb/ccc/ddd/test.java");
minil
fuente
1
¿Es esto para un archivo genérico o está intentando obtener el directorio principal de su archivo fuente? Si es lo último, no estoy seguro de que entienda la compilación de Java. En tiempo de ejecución, test.javaprobablemente ni siquiera exista en la computadora donde se ejecuta el programa. Es el .classarchivo compilado que se ejecuta. Así que esto solo funcionará si sabe dónde dddestá ubicado, en cuyo caso no tiene sentido encontrarlo programáticamente; simplemente codifíquelo.
Mark Peters

Respuestas:

141

Utilice Fileel getParentFile()método de y String.lastIndexOf()para recuperar solo el directorio padre inmediato.

El comentario de Mark es una mejor solución que lastIndexOf():

file.getParentFile().getName();

Estas soluciones solo funcionan si el archivo tiene un archivo principal (por ejemplo, creado a través de uno de los constructores de archivos que toma un archivo principal File). Cuando getParentFile()sea ​​nulo, deberá recurrir al uso lastIndexOf, o usar algo como Apache Commons 'FileNameUtils.getFullPath() :

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

Hay varias variantes para retener / eliminar el prefijo y el separador final. Puede usar la misma FilenameUtilsclase para tomar el nombre del resultado, usar lastIndexOf, etc.

Dave Newton
fuente
14
No necesita lastIndexOf, solo use file.getParentFile().getName().
Mark Peters
13
Por si acaso. Si regresa null(si creó una Fileinstancia con una ruta relativa), intente file.getAbsoluteFile().getParentFile().getName().
nidu
1
@MarkPeters Eso solo funciona cuando el archivo se creó con un Archivo principal, lo cual supongo que es relativamente raro.
Dave Newton
20
File f = new File("C:/aaa/bbb/ccc/ddd/test.java");
System.out.println(f.getParentFile().getName())

f.getParentFile() puede ser nulo, por lo que debe marcarlo.

Surasin Tancharoen
fuente
1
Solo para asegurarse, el resultado es el siguiente: C: / aaa / bbb / ccc / ddd
Guy Avraham
16

Utilice a continuación,

File file = new File("file/path");
String parentPath = file.getAbsoluteFile().getParent();
Ishan Liyanage
fuente
Vale la pena señalar que este método debe tener un conjunto principal, incluso si el archivo subyacente no lo tiene.
Ritmo
13

En Java 7 tienes la nueva API de Paths . La solución moderna y más limpia es:

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

El resultado sería:

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

Si solo tiene una ruta de cadena y no desea crear un nuevo objeto de archivo, puede 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
fuente
4
Esto arroja ArrayOutOfBoundsException si ya está en la ubicación raíz - "/" -
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"

si necesita agregar la carpeta "ddd" por otra ruta, use;

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

Desde Java 7, preferiría usar Path. Solo necesitas poner la ruta en:

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

y crea un método get:

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

En Groovy:

No es necesario crear una Fileinstancia para analizar la cadena en groovy. Se puede hacer de la siguiente manera:

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

La división creará la matriz [C:, aaa, bbb, ccc, ddd, test.java]y el índice -2apuntará a la entrada anterior a la última, que en este caso esddd

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