Как получить имя файла без расширения из пути к файлу в Ruby - PullRequest
221 голосов
/ 17 декабря 2008

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

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

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

Ответы [ 9 ]

576 голосов
/ 17 декабря 2008

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

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

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"
93 голосов
/ 17 декабря 2008
require 'pathname'

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

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

56 голосов
/ 17 декабря 2008

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

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"
23 голосов
/ 27 августа 2014

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

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

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

11 голосов
/ 28 ноября 2016

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

Использование extname

 File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test" 
7 голосов
/ 17 декабря 2008

Ответ Джонатона лучше, но дать вам знать, 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"
4 голосов
/ 17 декабря 2008

Обратите внимание, что строки в двойных кавычках экранируются.

'C:\projects\blah.dll'.split('\\').last
0 голосов
/ 14 сентября 2011

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

File.dirname __FILE__
0 голосов
/ 06 июля 2009

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

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

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

__FILE__.scan(/\w+\.\w+$/)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...