¿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 LastIndexOfmé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 LastIndexOfmé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.
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)
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").basenameobtener 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 LastIndexOfanotaciones disponibles.
Como krusty.ar mencionó somelist.lastaparentemente 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, 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:
__FILE__.scan(/\w+\.\w+$/)