sirve - ruby tutorial
Cómo obtener un nombre de archivo sin extensión desde la ruta del archivo en Ruby (9)
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"
¿Cómo puedo obtener el nombre de archivo de una ruta de archivo en Ruby?
Por ejemplo, si tengo una ruta de "C:/projects/blah.dll"
y solo quiero el "blah".
¿Hay un método LastIndexOf
en Ruby?
Intente File.basename
Devuelve el último componente del nombre de archivo dado en nombre_archivo, que debe formarse mediante barras diagonales (`` / '''') independientemente del separador usado en el sistema de archivos local. Si se da un sufijo y está presente al final de nombre_archivo, 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"
La respuesta de Jonathon es mejor, pero para hacerte saber, somelist[-1]
es una de las notaciones de LastIndexOf
disponibles.
Como krusty.ar mencionó somelist.last
apariencia 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"
Prueba este codigo
Usar extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
Puede obtener la ruta del directorio al script actual con:
File.dirname __FILE__
Si tiene acceso a las variables ENV, el scan
combinado con esta pequeña expresión regular (que encuentra la última palabra pero una, un punto, luego la última palabra de la cadena) colocará el nombre del archivo en ''nombre de archivo'':
filename = ENV[''SCRIPT_NAME''].scan(//w+/./w+$/)
Obviamente, puedes usar scan
y la expresión regular en cualquier nombre de ruta que incluya el nombre del archivo, y __FILE__
es la opción obvia:
__FILE__.scan(//w+/./w+$/)
Tenga en cuenta que las cadenas de comillas dobles se escapan.
''C:/projects/blah.dll''.split(''//').last
Jonathan Lonowski respondió perfectamente, pero hay algo que ninguna de las respuestas se menciona aquí. En lugar de File::extname
, puede usar directamente un ''.*''
Para obtener el nombre del archivo.
File.basename("C://projects//blah.dll", ".*") # => "C://projects//blah"
Pero, si desea obtener el nombre de archivo base de algún archivo de extensión específico , entonces necesita usar File::extname
, de lo contrario no.
require ''pathname''
Pathname.new(''/opt/local/bin/ruby'').basename
# => #<Pathname:ruby>
No he sido usuario de Windows en mucho tiempo, pero rdoc de Pathname dice que no tiene problemas con los separadores de nombre de directorio en Windows.