Имейте в виду, что нет ничего особенного в точке, за которой следуют некоторые (возможно, три) символа. Они являются частью имени файла. Некоторые периферийные операционные системы считают, что в этой части имени файла есть что-то особенное, но вы не должны попадать в эту ловушку.
Я не знаю, почему это # 1 ранжированный ответ, когда File.basename не требует дополнительного 'require' из 'pathname'.
GroovyCakes
11
Класс pathnameработает с локальными путями, в то время как Fileвсегда принимает имена путей Unix (например, различие между разделителями пути и диска, которые используются в MS Windows)
nimrodm 21.12.12
3
Несмотря на то, что он принят ОП, этот ответ фактически не отвечает на вопрос ОП. См. Ответы Джонатана Лоновски и Арупа Ракшита.
GSnyder
6
Расширение присутствует, если оно есть. Ответ неверный.
Людовик Куты
4
Пожалуйста, не вандализируйте свои собственные сообщения. Спасибо!
Возвращает последний компонент имени файла, указанный в file_name, который должен быть сформирован с использованием прямой косой черты (`` / '') независимо от разделителя, используемого в локальной файловой системе. Если суффикс задан и присутствует в конце имени_файла, он удаляется.
Джонатан Лоновски ответил отлично, но есть то, что ни один из ответов не упомянут здесь. Вместо этого File::extnameвы можете напрямую использовать '.*'для получения имени файла.
Обрабатывает его исключительно как строку, а не как путь, что делает код менее переносимым.
кодек
Это намного сложнее, чем нужно, и зависит от Windows. Вы можете просто File.basename. И, как и некоторые другие ответы, не отвечает на вопрос ОП.
Кит Беннетт
0
Если у вас есть доступ к переменным ENV, в scanсочетании с этим небольшим регулярным выражением (которое находит последнее, кроме одного слова, точку, а затем последнее слово строки), имя файла будет помещено в «имя файла»:
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Очевидно, вы можете использовать scanи регулярное выражение для любого пути, который включает имя файла, и __FILE__это очевидный выбор:
Ответы:
Я давно не был пользователем Windows, но rdoc Pathname говорит, что у него нет проблем с разделителями имен каталогов в Windows.
источник
pathname
работает с локальными путями, в то время какFile
всегда принимает имена путей Unix (например, различие между разделителями пути и диска, которые используются в MS Windows)Пытаться
File.basename
В твоем случае:
источник
Pathname.new("some/path/to/my.file").basename
получитьmy.file/
: '(File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?Если расширение неизвестно (для него требуется разделитель /):
источник
Джонатан Лоновски ответил отлично, но есть то, что ни один из ответов не упомянут здесь. Вместо этого
File::extname
вы можете напрямую использовать'.*'
для получения имени файла.Но, если вы хотите получить базовое имя какого- либо конкретного файла расширения , вам нужно использовать
File::extname
, иначе нет.источник
Попробуйте этот код
использование
extname
источник
Ответ Джонатона лучше, но дать вам знать,
somelist[-1]
это одна изLastIndexOf
доступных обозначений.Как упоминал krusty.ar
somelist.last
видимо тоже.источник
Обратите внимание, что строки в двойных кавычках экранируют.
источник
File.basename
. И, как и некоторые другие ответы, не отвечает на вопрос ОП.Если у вас есть доступ к переменным ENV, в
scan
сочетании с этим небольшим регулярным выражением (которое находит последнее, кроме одного слова, точку, а затем последнее слово строки), имя файла будет помещено в «имя файла»:Очевидно, вы можете использовать
scan
и регулярное выражение для любого пути, который включает имя файла, и__FILE__
это очевидный выбор:источник
Вы можете получить путь к каталогу к текущему скрипту с помощью:
источник
File.basename __FILE__