String
variable contiene un nombre de archivo, C:\Hello\AnotherFolder\The File Name.PDF
. ¿Cómo obtengo solo el nombre del archivo The File Name.PDF
como una cadena?
Planeaba dividir la cadena, pero esa no es la solución óptima.
String
variable contiene un nombre de archivo, C:\Hello\AnotherFolder\The File Name.PDF
. ¿Cómo obtengo solo el nombre del archivo The File Name.PDF
como una cadena?
Planeaba dividir la cadena, pero esa no es la solución óptima.
Respuestas:
solo use File.getName ()
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());
utilizando métodos de cadena :
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
Uso alternativo Path
(Java 7+):
Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();
Tenga en cuenta que dividir la cadena \\
depende de la plataforma, ya que el separador de archivos puede variar. Path#getName
se encarga de ese problema por ti.
Paths.get
acceda al sistema de archivos, por lo que no esperaría que el rendimiento sea materialmente diferente de una subcadena / indexOf.
Internet Explorer
y tiene la ruta, "C:\\Hello\\AnotherFolder\\The File Name.PDF"
pero su código está funcionando en una máquina Unix / Linux y luego p.getFileName()
devolverá la ruta completa, no solo The File Name.PDF
.
toString()
es muy incómodo.
Utilizando FilenameUtils
en Apache Commons IO :
String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
Teniendo en cuenta lo String
que estás preguntando es
C:\Hello\AnotherFolder\The File Name.PDF
necesitamos extraer todo después del último separador, es decir. \
. Eso es lo que nos interesa.
Tu puedes hacer
String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);
Esto recuperará el índice del último \
en su String
y extraerá todo lo que viene después fileName
.
Si tiene un String
separador diferente, ajuste el lastIndexOf
para usar ese separador. (Incluso hay una sobrecarga que acepta un todo String
como separador).
Lo he omitido en el ejemplo anterior, pero si no está seguro de dónde String
proviene o qué podría contener, querrá validar que lastIndexOf
devuelve un valor no negativo porque el Javadoc indica que devolverá
-1 si no hay tal ocurrencia
puede usar path = C: \ Hello \ AnotherFolder \ TheFileName.PDF
String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
/
en unix y \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like
File` o Paths
.
File.separator
También depende de la plataforma? ¿O esto funcionaría ... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
File.separator
no siempre funcionará aquí porque en Windows un nombre de archivo se puede separar con "/"
o "\\"
.
Las otras respuestas no funcionaron para mi escenario específico, donde estoy leyendo rutas que se han originado desde un sistema operativo diferente al actual. Para elaborar, estoy guardando archivos adjuntos de correo electrónico guardados desde una plataforma Windows en un servidor Linux. El nombre de archivo devuelto por la API JavaMail es algo así como 'C: \ temp \ hello.xls'
La solución que terminé con:
String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];
Considere el caso de que Java es multiplataforma:
int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
fileName = fileName.substring(lastPath+1);
}
Un método sin ninguna dependencia y se encarga de ... , . y separadores duplicados.
public static String getFileName(String filePath) {
if( filePath==null || filePath.length()==0 )
return "";
filePath = filePath.replaceAll("[/\\\\]+", "/");
int len = filePath.length(),
upCount = 0;
while( len>0 ) {
//remove trailing separator
if( filePath.charAt(len-1)=='/' ) {
len--;
if( len==0 )
return "";
}
int lastInd = filePath.lastIndexOf('/', len-1);
String fileName = filePath.substring(lastInd+1, len);
if( fileName.equals(".") ) {
len--;
}
else if( fileName.equals("..") ) {
len -= 2;
upCount++;
}
else {
if( upCount==0 )
return fileName;
upCount--;
len -= fileName.length();
}
}
return "";
}
Caso de prueba:
@Test
public void testGetFileName() {
assertEquals("", getFileName("/"));
assertEquals("", getFileName("////"));
assertEquals("", getFileName("//C//.//../"));
assertEquals("", getFileName("C//.//../"));
assertEquals("C", getFileName("C"));
assertEquals("C", getFileName("/C"));
assertEquals("C", getFileName("/C/"));
assertEquals("C", getFileName("//C//"));
assertEquals("C", getFileName("/A/B/C/"));
assertEquals("C", getFileName("/A/B/C"));
assertEquals("C", getFileName("/C/./B/../"));
assertEquals("C", getFileName("//C//./B//..///"));
assertEquals("user", getFileName("/user/java/.."));
assertEquals("C:", getFileName("C:"));
assertEquals("C:", getFileName("/C:"));
assertEquals("java", getFileName("C:\\Program Files (x86)\\java\\bin\\.."));
assertEquals("C.ext", getFileName("/A/B/C.ext"));
assertEquals("C.ext", getFileName("C.ext"));
}
Quizás getFileName es un poco confuso, porque también devuelve nombres de directorio. Devuelve el nombre del archivo o el último directorio en una ruta.
extraer el nombre del archivo usando java regex *.
public String extractFileName(String fullPathFile){
try {
Pattern regex = Pattern.compile("([^\\\\/:*?\"<>|\r\n]+$)");
Matcher regexMatcher = regex.matcher(fullPathFile);
if (regexMatcher.find()){
return regexMatcher.group(1);
}
} catch (PatternSyntaxException ex) {
LOG.info("extractFileName::pattern problem <"+fullPathFile+">",ex);
}
return fullPathFile;
}
El método getFileName () de java.nio.file.Path se utiliza para devolver el nombre del archivo o directorio señalado por este objeto de ruta.
Ruta getFileName ()
Para referencia:
https://www.geeksforgeeks.org/path-getfilename-method-in-java-with-examples/
Puede usar el objeto FileInfo para obtener toda la información de su archivo.
FileInfo f = new FileInfo(@"C:\Hello\AnotherFolder\The File Name.PDF");
MessageBox.Show(f.Name);
MessageBox.Show(f.FullName);
MessageBox.Show(f.Extension );
MessageBox.Show(f.DirectoryName);