如何从Ruby文件路径中获得文件名无扩展名
如何从Ruby中的文件路径获取文件名?如何从Ruby文件路径中获得文件名无扩展名
例如,如果我有一个路径"C:\projects\blah.dll"
,我只想要“等等”。
Ruby中是否有LastIndexOf
方法?
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
我还没有一个Windows用户在很长一段时间,但路径名的RDoc说,它与Windows目录名称分隔符没有问题。
我不知道为什么这是排名第一的答案,当File.basename不需要额外的'require''pathname'。 – GroovyCakes 2012-08-29 23:58:36
class`pathname`使用本地路径名而File一直采用Unix路径名(不同之处在于MS Windows中使用的路径和驱动器分隔符) – nimrodm 2012-12-21 16:50:56
返回(``/””),而不管本地文件系统上所使用的隔板的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"
对于Linux和Ruby 1.8,我尝试使用`Pathname.new(“some/path/to/my.file”)。basename`并获取`my.file /`:'( – 2010-02-05 10:59:24
更一般地说,`File.basename(“C :\\ projects \\ blah.dll“,”。*“)#=>”blah“` – kelloti 2012-03-25 23:22:57
注意的是双引号字符串逃过\'s。
'C:\projects\blah.dll'.split('\\').last
将它纯粹作为一个字符串,而不是一个路径,使得代码的可移植性降低。 – boatcoder 2010-11-21 21:58:27
乔纳森的回答是好,但让你知道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"
问题在于你需要知道它是反斜杠还是正斜杠 – 2013-09-25 10:33:36
万一不知道分机(它需要/分隔符):
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 = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
很明显,你可以使用scan
和包含文件名的路径名正则表达式,并__FILE__
是显而易见的选择:
__FILE__.scan(/\w+\.\w+$/)
你可以得到目录路径当前的脚本:
File.dirname __FILE__
Jonathan Lonowski完美的回答,但就是没有一个答案在这里提到的某些东西。而不是File::extname
,您可以直接使用'.*'
来获取文件名。
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
但是,如果你想获得的基本文件名的任何特定扩展名的文件,那么你需要使用File::extname
,否则不是。
请记住,没有什么特别的点,然后一些(三级,也许是)字符。它们是文件名称的一部分。一些边缘操作系统认为文件名的某个部分有特殊之处,但不应该陷入这个陷阱。 – 2012-06-04 00:20:45