2008-12-17 24 views
212

¿Cómo puedo obtener el nombre de archivo de una ruta de archivo en Ruby?Cómo obtener un nombre de archivo sin extensión desde la ruta del archivo en Ruby

Por ejemplo, si tengo una ruta de "C:\projects\blah.dll" y solo quiero el "bla".

¿Hay un método LastIndexOf en Ruby?

+3

Tenga en cuenta que no hay nada especial acerca de un punto seguido por algunos (tres, tal vez) caracteres. Son parte del nombre del archivo. Algunos sistemas operativos periféricos creen que hay algo especial en esa parte de un nombre de archivo, pero no debes caer en esa trampa. –

Respuesta

90
require 'pathname' 

Pathname.new('/opt/local/bin/ruby').basename 
# => #<Pathname:ruby> 

no he sido un usuario de Windows en un largo tiempo, pero el nombre de ruta rdoc dice que no tiene problemas con los separadores de nombre-directorio en Windows.

+76

No sé por qué esta es la respuesta clasificada # 1 cuando File.basename no requiere un 'requerimiento' adicional de 'pathname'. – GroovyCakes

+10

La clase 'pathname' funciona con nombres de ruta locales mientras que 'File' siempre asume los nombres de ruta de acceso de Unix (diferencia es la ruta y los separadores de unidad que se usan en MS Windows, por ejemplo) – nimrodm

+0

@korch: Probablemente debería mostrar el comportamiento diferente de' Pathname.new ("C:/some/path") .basename' a 'File.basename (" C:/some/path ")' (vea el comentario de nimrodm). –

564

Trate File.basename

Devuelve el último componente del nombre de archivo dado en nombre_archivo, que debe ser formada utilizando barras inclinadas (`` /’’), independientemente del separador utilizado en el sistema de archivos local. Si el sufijo está dado y 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 su caso:

File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah" 
+0

Con Linux y Ruby 1.8 pruebo 'Pathname.new (" some/path/to/my.file "). Basename' y obtengo' my.file/': '( –

+57

Más genéricamente,' File.basename ("C : \\ projects \\ blah.dll ",". * ") # =>" bla "' – kelloti

3

Tenga en cuenta que las comillas dobles cadenas de escape \ 's.

'C:\projects\blah.dll'.split('\\').last 
+5

Lo trata simplemente como una cadena, en lugar de como una ruta, hace que el código sea menos portable. – boatcoder

7

respuesta de Jonathan es mejor, pero para hacerle saber somelist[-1] es una de las notaciones LastIndexOf disponibles.

Como krusty.ar mencionó somelist.last aparentemente es demasiado.

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" 
+1

problema con eso es que usted necesito saber si es una barra invertida o una barra oblicua –

53

En caso de que no se conoce la extensión (que 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" 
+5

File.basename() es la respuesta! – sivabudh

0

Si usted tiene acceso a las variables ENV, scan combinado con este pequeño expresiones regulares (que encuentra la penúltima palabra, una punto, entonces la última palabra de la cadena) se puso el nombre del archivo en 'nombre de archivo':

filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/) 

Obviamente, puede utilizar scan y la expresión regular en cualquier nombre de ruta que incluye el nombre de archivo y __FILE__ es lo obvio elección:

__FILE__.scan(/\w+\.\w+$/) 
-5

Usted puede obtener la ruta del directorio de script actual con:

File.dirname __FILE__ 
+0

La pregunta no era sobre el camino, era sobre el ** nombre de archivo **. "¿Cómo puedo obtener el ** nombre de archivo ** de una ruta de archivo en Ruby?" – fontno

+0

Eso sería: 'File.basename __FILE__' – Samuel

19

Jonathan Lonowski respondió a la perfección, pero hay algo que ninguna de las respuestas 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 se desea obtener el nombre del archivo de base de los archivos de extensión específicos, entonces es necesario utilizar File::extname, de lo contrario no.

8

probar este código

Uso extname

File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test" 
Cuestiones relacionadas