如何在Ruby中从文件路径获取没有扩展名的文件名

时间:2008-12-17 11:55:25

标签: ruby

如何从Ruby中的文件路径获取文件名?

例如,如果我的路径为"C:\projects\blah.dll"而我只想要“等等”。

Ruby中有LastIndexOf方法吗?

10 个答案:

答案 0 :(得分:576)

尝试File.basename

  

返回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"

答案 1 :(得分:92)

require 'pathname'

Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>

我很长一段时间没有成为Windows用户,但Pathname rdoc表示Windows上的目录名分隔符没有问题。

答案 2 :(得分:55)

如果扩展名未知(需要/ separator):

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"

答案 3 :(得分:22)

Jonathan Lonowski回答得很完美,但是这里提到的答案都没有。您可以直接使用'.*'来获取文件名,而不是File::extname

File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"

但是,如果您想获取任何特定扩展文件的基本文件名,那么您需要使用File::extname,否则不需要。

答案 4 :(得分:11)

试试此代码

使用extname

 File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test" 

答案 5 :(得分:7)

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"

答案 6 :(得分:4)

请注意双引号字符串escape \'s。

'C:\projects\blah.dll'.split('\\').last

答案 7 :(得分:1)

我个人更喜欢将 Pathname.* 一起使用

path = Pathname.new('/home/motine/myname.dll')
path.basename('.*') # => "myname"

basename 实际上返回一个 Pathname 实例。如果你想强制一个字符串,你可以在它上面调用 to_s

答案 8 :(得分:0)

如果您可以访问ENV变量,scan结合这个小正则表达式(找到最后但只有一个单词,一个点,那么字符串的最后一个单词)会将文件的名称放入'filename' :

filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)

显然,您可以在包含文件名的任何路径名上使用scan和正则表达式,__FILE__是显而易见的选择:

__FILE__.scan(/\w+\.\w+$/)

答案 9 :(得分:-5)

您可以使用以下命令获取当前脚本的目录路径:

File.dirname __FILE__