Как я могу получить имя файла из пути к файлу в Ruby?
Например, если у меня есть путь, "C:\projects\blah.dll"
и я просто хочу "бла".
Есть ли LastIndexOf
метод в Ruby?
Как я могу получить имя файла из пути к файлу в Ruby?
Например, если у меня есть путь, "C:\projects\blah.dll"
и я просто хочу "бла".
Есть ли LastIndexOf
метод в Ruby?
Ответы:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
Я давно не был пользователем Windows, но rdoc Pathname говорит, что у него нет проблем с разделителями имен каталогов в Windows.
pathname
работает с локальными путями, в то время как File
всегда принимает имена путей Unix (например, различие между разделителями пути и диска, которые используются в MS Windows)
Пытаться 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"
Pathname.new("some/path/to/my.file").basename
получить my.file/
: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?
Если расширение неизвестно (для него требуется разделитель /):
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"
Джонатан Лоновски ответил отлично, но есть то, что ни один из ответов не упомянут здесь. Вместо этого 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
доступных обозначений.
Как упоминал 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"
Обратите внимание, что строки в двойных кавычках экранируют.
'C:\projects\blah.dll'.split('\\').last
File.basename
. И, как и некоторые другие ответы, не отвечает на вопрос ОП.
Если у вас есть доступ к переменным ENV, в scan
сочетании с этим небольшим регулярным выражением (которое находит последнее, кроме одного слова, точку, а затем последнее слово строки), имя файла будет помещено в «имя файла»:
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Очевидно, вы можете использовать scan
и регулярное выражение для любого пути, который включает имя файла, и __FILE__
это очевидный выбор:
__FILE__.scan(/\w+\.\w+$/)