如何从Ruby中的文件路径获取不带扩展名的文件名


233

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

例如,如果我有一条路径,"C:\projects\blah.dll"而我只想要“ blah”。

LastIndexOfRuby中有方法吗?


3
请记住,点后跟一些(可能是三个)字符没有什么特别的。它们是文件名的一部分。一些附带的操作系统认为文件名的那部分有一些特殊之处,但是您不应该陷入陷阱。
James Moore

Answers:


94
require 'pathname'

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

我已经很长时间没有使用Windows了,但是路径名rdoc表示Windows上的目录名称分隔符没有问题。


86
当File.basename不需要“ pathname”的额外“ require”时,我不知道为什么这是排名第一的答案。
GroovyCakes,2012年

11
该类pathname使用本地路径名工作,而File始终使用Unix路径名(例如,差异是MS Windows中使用的路径和驱动器分隔符)
nimrodm 2012年

3
尽管被OP接受,但该答案实际上并未回答OP的问题。参见乔纳森·洛诺夫斯基(Jonathan Lonowski)和奥拉普·拉希特(Arup Rakshit)的答案。
GSnyder '16

6
如果有扩展名,则该扩展名存在。答案是错误的。
Ludovic Kuty

4
请不要破坏自己的帖子。谢谢!
NobodyNada's

586

尝试 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"

使用Linux和Ruby 1.8,我尝试Pathname.new("some/path/to/my.file").basename获取my.file/:'(
java.is.for.desktop 2010年

67
更笼统地说,File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
kelloti 2012年

答案应该是添加@kelloti的解决方案,效果更好。
ymoreau

@kelloti:那/my/file.tar.gz呢?
理查德·迪根




8

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"

1
问题在于您需要知道它是反斜线还是正斜线
Joseph Le Brech 2013年

4

请注意,双引号字符串转义\。

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

5
纯粹将其视为字符串而非路径,会使代码的可移植性降低。
boatcoder 2010年

这比所需的方法复杂得多,并且特定于Windows。你可以File.basename。而且,像其他一些答案一样,它不能回答OP的问题。
基思·贝内特

0

如果您可以访问ENV变量,scan并结合使用此正则表达式(可找到最后一个但一个单词,一个点,然后是字符串的最后一个单词),则会将该文件的名称放入“ filename”中:

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

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

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

-5

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

File.dirname __FILE__

问题不在于路径,而在于文件名。“如何从Ruby中的文件路径获取文件名?”
fontno

那将是:File.basename __FILE__
塞缪尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.