如何从 Ruby 中的文件路径中获取文件名?
例如,如果我的路径为 "C:\projects\blah.dll"
,而我只想要“blah”。
Ruby 中有 LastIndexOf
方法吗?
返回 file_name 中给定的文件名的最后一个组成部分,无论本地文件系统上使用的分隔符如何,都必须使用正斜杠 (``/'') 形成。如果给定后缀并出现在 file_name 的末尾,则将其删除。 File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> “红宝石”
在你的情况下:
File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah"
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
我很久没有成为 Windows 用户了,但是 Pathname rdoc 说它在 Windows 上没有目录名称分隔符的问题。
pathname
使用本地路径名,而 File
始终假定 Unix 路径名(不同之处在于 MS 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"
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"
请注意,双引号字符串会转义 \'s。
'C:\projects\blah.dll'.split('\\').last
File.basename
。而且,与其他一些答案一样,它没有回答 OP 的问题。
我个人更喜欢将 Pathname
与 .*
一起使用
path = Pathname.new('/home/motine/myname.dll')
path.basename('.*') # => "myname"
basename
实际上返回一个 Pathname
实例。如果你想强制一个字符串,你可以在它上面调用 to_s
。
如果您可以访问 ENV 变量,scan
结合这个小正则表达式(查找最后一个单词,一个点,然后是字符串的最后一个单词)会将文件名放入“文件名”:
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
显然,您可以在包含文件名的任何路径名上使用 scan
和正则表达式,而 __FILE__
是显而易见的选择:
__FILE__.scan(/\w+\.\w+$/)
您可以使用以下命令获取当前脚本的目录路径:
File.dirname __FILE__
File.basename __FILE__
Pathname.new("some/path/to/my.file").basename
并得到my.file/
:'(File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
呢?