如何从Ruby中的文件路径中获取文件名?
例如,如果我有一个路径"C:\projects\blah.dll",我只想要“blah”。
"C:\projects\blah.dll"
在Ruby中有LastIndexOf方法吗?
LastIndexOf
尝试File.basename
File.basename
返回file_name中给出的文件名的最后一个组件,必须使用正斜杠(' ' / ")来组成,而不管本地文件系统上使用的分隔符是什么。如果suffix出现在file_name的末尾,它将被删除。 File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
返回file_name中给出的文件名的最后一个组件,必须使用正斜杠(' ' / ")来组成,而不管本地文件系统上使用的分隔符是什么。如果suffix出现在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"
注意双引号字符串转义。
'C:\projects\blah.dll'.split('\\').last
Jonathon的答案更好,但要让你知道somelist[-1]是可用的LastIndexOf符号之一。
somelist[-1]
krusty。ar提到somelist.last显然也是。
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"
require 'pathname' Pathname.new('/opt/local/bin/ruby').basename # => #<Pathname:ruby>
我不是Windows用户很长时间了,但是Pathname rdoc说它在Windows上没有目录名称分隔符的问题。
如果扩展名不知道(它需要/分隔符):
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"
如果你可以访问ENV变量,scan结合这个小正则表达式(它可以找到倒数第二个单词,一个点,然后是字符串的最后一个单词)将把文件的名称放在'filename'中:
scan
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
显然,你可以在任何包含文件名的路径名上使用scan和正则表达式,而__FILE__是明显的选择:
__FILE__
__FILE__.scan(/\w+\.\w+$/)
你可以获得当前脚本的目录路径:
File.dirname __FILE__
乔纳森Lonowski回答得很完美,但这里没有一个答案提到的东西。你可以直接使用'.*'来获取文件名,而不是File::extname。
'.*'
File::extname
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
但是,如果你想要获得任何特定的扩展文件的基文件名,那么你需要使用File::extname,否则不行。
试试这段代码
使用extname
extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
我个人更喜欢使用Pathname和.*
Pathname
.*
path = Pathname.new('/home/motine/myname.dll') path.basename('.*') # => "myname"
basename实际上返回一个Pathname实例。如果你想强制一个字符串,你可以对它调用to_s。
basename
to_s