Answers:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
我已经很长时间没有使用Windows了,但是路径名rdoc表示Windows上的目录名称分隔符没有问题。
pathname
使用本地路径名工作,而File
始终使用Unix路径名(例如,差异是MS Windows中使用的路径和驱动器分隔符)
返回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"
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"
乔纳森·洛诺夫斯基(Jonathan Lonowski)的回答很完美,但是这里没有提到任何答案。代替File::extname
,您可以直接使用'.*'
获取文件名。
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
但是,如果要获取任何特定扩展名文件的基本文件名,则需要使用File::extname
,否则不需要。
Jonathon的答案更好,但是让您知道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
。而且,像其他一些答案一样,它不能回答OP的问题。
如果您可以访问ENV变量,scan
并结合使用此正则表达式(可找到最后一个但一个单词,一个点,然后是字符串的最后一个单词),则会将该文件的名称放入“ filename”中:
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
显然,您可以scan
在包含文件名的任何路径名上使用和regex,这__FILE__
是显而易见的选择:
__FILE__.scan(/\w+\.\w+$/)