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

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

например, если у меня есть путь "C:projectsblah.dll" и я просто хочу "бла-бла".

есть LastIndexOf метод в Ruby?

9 ответов


require 'pathname'

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

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


попробовать File.basename

возвращает последний компонент имени файла, заданного в file_name, который должен быть сформирован с помощью прямых косых черт (`/’) независимо от разделителя, используемого в локальной файловой системе. Если суффикс задан и присутствует в конце 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"

в случае, если расширение неизвестно (ему нужен / separator):

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"

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

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

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


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

использовать extname

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

ответ Джонатана лучше, но чтобы вы знали somelist[-1] один из LastIndexOf нотаций доступен.

как Красти.АР упомянул 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"

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

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

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

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

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

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

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

File.dirname __FILE__