Як отримати ім'я файлу без розширення з шляху файлу в Ruby


233

Як я можу отримати ім'я файлу з шляху файлу в Ruby?

Наприклад, якщо у мене є шлях "C:\projects\blah.dll"і я просто хочу "бла".

Чи є LastIndexOfметод у Рубі?


3
Майте на увазі, що в крапці, за якою слідують деякі (три, мабуть) символи, немає нічого особливого. Вони є частиною назви файлу. Деякі операційні системи бахроми вважають, що в цій частині імені файлу є щось особливе, але вам не слід потрапляти в цю пастку.
Джеймс Мур

Відповіді:


94
require 'pathname'

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

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


86
Я не знаю, чому це відповідь №1, коли File.basename не потребує додаткового "вимагати" з "ім'я шляху".
GroovyCakes

11
Клас pathnameпрацює з локальними іменами шляхів, хоча Fileзавжди припускає імена шляхів Unix (різниця - розділювачі шляху та накопичувача, які використовуються, наприклад, у MS Windows)
nimrodm

3
Незважаючи на те, що її прийняв ОП, ця відповідь насправді не відповідає на питання ОП. Дивіться відповіді Джонатана Лоновського та Арупа Ракшита.
GSnyder

6
Розширення є, якщо воно є. Відповідь неправильна.
Людович Куті

4
Будь ласка, не скасовуйте власні повідомлення. Дякую!
НіхтоНада

586

Спробуйте 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"

З Linux і Ruby 1.8 я намагаюся Pathname.new("some/path/to/my.file").basenameотримати my.file/: '(
java.is.for.desktop

67
Більш загально,File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
kelloti

У відповідь слід додати розчин @kelloti, який краще.
ymoreau

@kelloti: А як /my/file.tar.gz?
Річард-Деген

56

Якщо розширення не відоме (йому потрібен / роздільник):

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"

5
File.basename () - це відповідь!
sivabudh

26

Джонатан Лоновський відповів прекрасно, але є щось таке, що жодна з відповідей тут не згадується. Замість цього File::extnameви можете безпосередньо використовувати a, '.*'щоб отримати ім'я файлу.

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

Але, якщо ви хочете отримати базове ім'я файлу будь-яких конкретних файлів розширень , тоді вам потрібно скористатися File::extname, інакше ні.



8

Відповідь Джонатана є кращою, але повідомити вас 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"

1
Проблема в тому, що вам потрібно знати, чи це кут нахилу або нахил вперед
Джозеф Ле Брех,

4

Зауважте, що рядки подвійних лапок вникають \ 's.

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

5
Розглядає його суто як строку, а не як шлях, робить код менш портативним.
boatcoder

Це набагато складніше, ніж потрібно, і є специфічним для Windows. Можна просто File.basename. І, як і деякі інші відповіді, не відповідає на питання ОП.
Кіт Беннетт

0

Якщо у вас є доступ до змінних ENV, у scanпоєднанні з цим маленьким регулярним виразом (який знаходить останнє, але одне слово, крапку, а потім останнє слово рядка) буде переведено ім'я файлу у "ім'я файлу":

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

Очевидно, ви можете використовувати scanі регулярний вираз на будь-якому імені шляху, що включає ім'я файлу, і __FILE__це очевидний вибір:

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

-5

Ви можете отримати шлях до каталогу до поточного сценарію за допомогою:

File.dirname __FILE__

Питання полягало не в шляху, а в назві файлу . "Як я можу отримати ім'я файлу з шляху до файлу в Ruby?"
fontno

Це було б:File.basename __FILE__
Самуїл,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.