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

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.


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.


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

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

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

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

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

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


0
    //get the parentfolder name
    File file = new File( System.getProperty("user.dir") + "/.");
    String parentPath = file.getParentFile().getName();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.