¿Cómo obtengo el nombre del archivo de una cadena que contiene la ruta absoluta del archivo?
237
Stringvariable contiene un nombre de archivo, C:\Hello\AnotherFolder\The File Name.PDF. ¿Cómo obtengo solo el nombre del archivo The File Name.PDFcomo una cadena?
Planeaba dividir la cadena, pero esa no es la solución óptima.
File f =newFile("C:\\Hello\\AnotherFolder\\The File Name.PDF");System.out.println(f.getName());
utilizando métodos de cadena :
File f =newFile("C:\\Hello\\AnotherFolder\\The File Name.PDF");System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
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#getNamese encarga de ese problema por ti.
¿Alguien ha hecho una comparación de rendimiento en los diversos métodos en esta pregunta?
aplastar
@crush No creo que Paths.getacceda al sistema de archivos, por lo que no esperaría que el rendimiento sea materialmente diferente de una subcadena / indexOf.
Assylias
77
¿Cómo es que no existe en Android? extraño.
Desarrollador de Android
12
Sí, Path hace frente al problema de barra diagonal / barra diagonal inversa dependiente de la plataforma, pero solo si la ruta del archivo es de la misma máquina (o plataforma). Considere esto: carga el archivo Internet Explorery 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.
Esto recuperará el índice del último \en su Stringy extraerá todo lo que viene después fileName.
Si tiene un Stringseparador diferente, ajuste el lastIndexOfpara usar ese separador. (Incluso hay una sobrecarga que acepta un todo Stringcomo separador).
Lo he omitido en el ejemplo anterior, pero si no está seguro de dónde Stringproviene o qué podría contener, querrá validar que lastIndexOfdevuelve un valor no negativo porque el Javadoc indica que devolverá
No debe usar ninguno de ellos, ya que depende de la plataforma. /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.
Automático
3
¿ File.separatorTambién depende de la plataforma? ¿O esto funcionaría ... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
Jonathan
File.separator y File.separatorChar son "/" en la versión UNIX / Linux / macOS de JDK, y ambos "\" en la versión de Windows.
賈 可 Jacky
2
File.separatorno siempre funcionará aquí porque en Windows un nombre de archivo se puede separar con "/"o "\\".
DodgyCodeException
10
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'
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.
Puede usar el objeto FileInfo para obtener toda la información de su archivo.
FileInfo f =newFileInfo(@"C:\Hello\AnotherFolder\The File Name.PDF");MessageBox.Show(f.Name);MessageBox.Show(f.FullName);MessageBox.Show(f.Extension);MessageBox.Show(f.DirectoryName);
Respuestas:
solo use File.getName ()
utilizando métodos de cadena :
fuente
Uso alternativo
Path
(Java 7+):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.fuente
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 luegop.getFileName()
devolverá la ruta completa, no soloThe File Name.PDF
.toString()
es muy incómodo.Utilizando
FilenameUtils
en Apache Commons IO :fuente
Teniendo en cuenta lo
String
que estás preguntando esnecesitamos extraer todo después del último separador, es decir.
\
. Eso es lo que nos interesa.Tu puedes hacer
Esto recuperará el índice del último
\
en suString
y extraerá todo lo que viene despuésfileName
.Si tiene un
String
separador diferente, ajuste ellastIndexOf
para usar ese separador. (Incluso hay una sobrecarga que acepta un todoString
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 quelastIndexOf
devuelve un valor no negativo porque el Javadoc indica que devolveráfuente
Desde 1.7
fuente
puede usar path = C: \ Hello \ AnotherFolder \ TheFileName.PDF
fuente
/
en unix y\`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like
File` oPaths
.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:
fuente
Considere el caso de que Java es multiplataforma:
fuente
Un método sin ninguna dependencia y se encarga de ... , . y separadores duplicados.
Caso de prueba:
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.
fuente
extraer el nombre del archivo usando java regex *.
fuente
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/
fuente
Puede usar el objeto FileInfo para obtener toda la información de su archivo.
fuente