Tenga en cuenta que no hay nada especial en un punto seguido de algunos (tres, tal vez) caracteres. Son parte del nombre del archivo. Algunos sistemas operativos marginales piensan que hay algo especial en esa parte de un nombre de archivo, pero no debe caer en esa trampa.
No sé por qué esta es la respuesta n. ° 1 cuando File.basename no requiere un 'require' adicional de 'pathname'.
GroovyCakes
11
La clase pathnamefunciona con nombres de ruta locales mientras que Filesiempre asume nombres de ruta de Unix (la diferencia es la ruta y los separadores de unidad que se usan en MS Windows, por ejemplo)
nimrodm
3
A pesar de ser aceptado por el OP, esta respuesta en realidad no responde a la pregunta del OP. Ver las respuestas de Jonathan Lonowski y Arup Rakshit.
GSnyder
66
La extensión está presente si hay una. La respuesta es incorrecta.
Devuelve el último componente del nombre de archivo dado en file_name, que debe formarse utilizando barras diagonales (`` / '') independientemente del separador utilizado en el sistema de archivos local. Si se proporciona el sufijo y está presente al final de file_name, se elimina.
Jonathan Lonowski respondió perfectamente, pero hay algo que ninguna de las respuestas menciona aquí. En lugar de File::extname, puede usar directamente a '.*'para obtener el nombre del archivo.
Pero, si desea obtener el nombre del archivo base de cualquier archivo de extensión específico , debe usarlo File::extname, de lo contrario no lo hará .
Lo trata puramente como una cadena, en lugar de como una ruta, hace que el código sea menos portátil.
Boatcoder
Esto es mucho más complejo de lo necesario y es específico de Windows. Puedes solo File.basename. Y, como algunas de las otras respuestas, no responde la pregunta del OP.
Keith Bennett
0
Si tiene acceso a variables ENV, scancombinado con esta pequeña expresión regular (que encuentra la última pero una palabra, un punto, luego la última palabra de la cadena) pondrá el nombre del archivo en 'nombre de archivo':
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Obviamente, puede usar scany la expresión regular en cualquier nombre de ruta que incluya el nombre de archivo, y __FILE__es la opción obvia:
Respuestas:
No he sido usuario de Windows en mucho tiempo, pero Pathname rdoc dice que no tiene problemas con los separadores de nombre de directorio en Windows.
fuente
pathname
funciona con nombres de ruta locales mientras queFile
siempre asume nombres de ruta de Unix (la diferencia es la ruta y los separadores de unidad que se usan en MS Windows, por ejemplo)Tratar
File.basename
En tu caso:
fuente
Pathname.new("some/path/to/my.file").basename
obtenermy.file/
: '(File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?En caso de que no se conozca la extensión (necesita el separador /):
fuente
Jonathan Lonowski respondió perfectamente, pero hay algo que ninguna de las respuestas menciona aquí. En lugar de
File::extname
, puede usar directamente a'.*'
para obtener el nombre del archivo.Pero, si desea obtener el nombre del archivo base de cualquier archivo de extensión específico , debe usarlo
File::extname
, de lo contrario no lo hará .fuente
Prueba este código
Utilizar
extname
fuente
La respuesta de Jonathon es mejor, pero hacerle saber
somelist[-1]
es una de lasLastIndexOf
anotaciones disponibles.Como krusty.ar mencionó
somelist.last
aparentemente también lo es.fuente
Tenga en cuenta que las cadenas de comillas dobles se escapan.
fuente
File.basename
. Y, como algunas de las otras respuestas, no responde la pregunta del OP.Si tiene acceso a variables ENV,
scan
combinado con esta pequeña expresión regular (que encuentra la última pero una palabra, un punto, luego la última palabra de la cadena) pondrá el nombre del archivo en 'nombre de archivo':Obviamente, puede usar
scan
y la expresión regular en cualquier nombre de ruta que incluya el nombre de archivo, y__FILE__
es la opción obvia:fuente
Puede obtener la ruta del directorio al script actual con:
fuente
File.basename __FILE__