¿Cómo puedo obtener el nombre de archivo de una ruta de archivo en Ruby?
Por ejemplo, si tengo una ruta de acceso "C:\projects\blah.dll"
y solo quiero el "bla".
¿Hay algún LastIndexOf
método en Ruby?
¿Cómo puedo obtener el nombre de archivo de una ruta de archivo en Ruby?
Por ejemplo, si tengo una ruta de acceso "C:\projects\blah.dll"
y solo quiero el "bla".
¿Hay algún LastIndexOf
método en Ruby?
Respuestas:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
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.
pathname
funciona con nombres de ruta locales mientras que File
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
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.
File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
En tu caso:
File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah"
Pathname.new("some/path/to/my.file").basename
obtener my.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 /):
irb(main):024:0> f = 'C:\foobar\blah.txt'.gsub("\\","/")
=> "C:/foobar/blah.txt"
irb(main):027:0> File.basename(f,File.extname(f))
=> "blah"
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.
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
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á .
Prueba este código
Utilizar extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
La respuesta de Jonathon es mejor, pero hacerle saber somelist[-1]
es una de las LastIndexOf
anotaciones disponibles.
Como krusty.ar mencionó somelist.last
aparentemente también lo es.
irb(main):003:0* f = 'C:\\path\\file.txt'
irb(main):007:0> f.split('\\')
=> ["C:", "path", "file.txt"]
irb(main):008:0> f.split('\\')[-1]
=> "file.txt"
Tenga en cuenta que las cadenas de comillas dobles se escapan.
'C:\projects\blah.dll'.split('\\').last
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':
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
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:
__FILE__.scan(/\w+\.\w+$/)