Как получить имя файла без расширения из пути к файлу в Ruby

Как я могу получить имя файла из пути к файлу в Ruby?

Например, если у меня есть путь к "C:\projects\blah.dll", и я просто хочу "бла".

Есть ли метод LastIndexOf в Ruby?

Ответ 1

require 'pathname'

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

Я не был пользователем Windows за долгое время, но Pathname rdoc говорит, что у него нет проблем с разделителями-именами каталогов в Windows.

Ответ 2

Попробуйте File.basename

Возвращает последний компонент имени файла, указанный в имени файла, который должен быть сформирован с использованием косой черты (``/) независимо от разделителя, используемого в локальной файловой системе. Если суффикс указан и присутствует в конце файла_файла, он удаляется.

File.basename("/home/gumby/work/ruby.rb")          #=> "ruby.rb"
File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"

В вашем случае:

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

Ответ 3

Если расширение неизвестно (ему нужен разделитель /):

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"

Ответ 4

Джонатан Лоновски ответил отлично, но есть что-то, о чем ни один из ответов не упоминается здесь. Вместо File::extname вы можете напрямую использовать '.*' для получения имени файла.

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

Но если вы хотите получить имя базового файла для каких-либо конкретных файлов расширений, вам нужно использовать File::extname, иначе нет.

Ответ 5

Попробуйте этот код

Используйте extname

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

Ответ 6

Ответ Jonathon лучше, но чтобы вы знали, somelist[-1] является одной из доступных обозначений LastIndexOf.

Поскольку krusty.ar, упомянутый somelist.last, очевидно, тоже.

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"

Ответ 7

Обратите внимание, что строки с двойными кавычками escape\s.

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

Ответ 8

Если у вас есть доступ к переменным ENV, scan в сочетании с этим маленьким регулярным выражением (которое находит последнее, но одно слово, точками, затем последним словом строки), имя файла будет помещено в 'filename':

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

Очевидно, вы можете использовать scan и регулярное выражение для любого имени пути, которое включает имя файла, а __FILE__ - очевидный выбор:

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

Ответ 9

Вы можете получить путь каталога к текущему script с помощью:

File.dirname __FILE__