Как получить имя файла без расширения из пути к файлу в 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+$/)