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

dag*_*da1 228 ruby

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

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

LastIndexOfRuby中有方法吗?

Jon*_*ski 581

尝试 File.basename

返回file_name中给出的文件名的最后一个组件,它必须使用正斜杠("/")形成,而不管本地文件系统上使用的分隔符.如果给出后缀并出现在file_name的末尾,则将其删除.

File.basename("/home/gumby/work/ruby.rb")          #=> "ruby.rb"
File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

File.basename("C:\\projects\\blah.dll", ".dll")  #=> "blah"
Run Code Online (Sandbox Code Playgroud)

  • 更一般地说,`File.basename("C:\\ projects \\ blah.dll",".*")#=>"blah"` (65认同)

小智 93

require 'pathname'

Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
Run Code Online (Sandbox Code Playgroud)

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

  • 我不知道为什么当File.basename不需要额外的'require''pathname'时,这是排名第一的答案. (85认同)
  • 类`pathname`使用本地路径名,而`File`总是假设Unix路径名(例如,差异是在MS Windows中使用的路径和驱动器分隔符) (11认同)
  • 如果存在扩展名,则存在扩展名.答案是错的. (4认同)
  • 请不要破坏自己的帖子.谢谢! (4认同)
  • 尽管被OP接受,但这个答案实际上并没有回应OP的问题.请参阅Jonathan Lonowski和Arup Rakshit的答案. (3认同)

Vin*_*vic 56

如果扩展名未知(它需要/ 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"
Run Code Online (Sandbox Code Playgroud)

  • File.basename()就是答案! (5认同)

Aru*_*hit 25

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

File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
Run Code Online (Sandbox Code Playgroud)

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


Rah*_*tel 12

试试这个代码

使用 extname

 File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test" 
Run Code Online (Sandbox Code Playgroud)


mon*_*kut 8

乔纳森的答案更好,但让你知道的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"
Run Code Online (Sandbox Code Playgroud)

  • 问题在于您需要知道它是反斜杠还是正斜杠 (2认同)