Як я можу отримати ім'я файлу з шляху файлу в Ruby?
Наприклад, якщо у мене є шлях "C:\projects\blah.dll"
і я просто хочу "бла".
Чи є LastIndexOf
метод у Рубі?
Як я можу отримати ім'я файлу з шляху файлу в Ruby?
Наприклад, якщо у мене є шлях "C:\projects\blah.dll"
і я просто хочу "бла".
Чи є LastIndexOf
метод у Рубі?
Відповіді:
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
ви можете безпосередньо використовувати a, '.*'
щоб отримати ім'я файлу.
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"
Зауважте, що рядки подвійних лапок вникають \ 's.
'C:\projects\blah.dll'.split('\\').last
File.basename
. І, як і деякі інші відповіді, не відповідає на питання ОП.
Якщо у вас є доступ до змінних ENV, у scan
поєднанні з цим маленьким регулярним виразом (який знаходить останнє, але одне слово, крапку, а потім останнє слово рядка) буде переведено ім'я файлу у "ім'я файлу":
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Очевидно, ви можете використовувати scan
і регулярний вираз на будь-якому імені шляху, що включає ім'я файлу, і __FILE__
це очевидний вибір:
__FILE__.scan(/\w+\.\w+$/)