【问题标题】:How to get filename without extension from file path in Ruby如何从Ruby中的文件路径获取不带扩展名的文件名
【发布时间】:2010-09-27 07:44:30
【问题描述】:

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

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

Ruby 中有LastIndexOf 方法吗?

【问题讨论】:

  • 请记住,点后跟一些(可能是三个)字符并没有什么特别之处。它们是文件名的一部分。一些边缘操作系统认为文件名的那部分有什么特别之处,但你不应该落入这个陷阱。

标签: ruby


【解决方案1】:

试试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/ :'(
  • 更笼统地说,File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
  • 答案应该是添加@kelloti的解决方案,哪个更好。
  • @kelloti:/my/file.tar.gz 呢?
【解决方案2】:

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

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

【讨论】:

  • 纯粹将其视为字符串,而不是路径,这会降低代码的可移植性。
  • 这比需要的复杂得多,并且是特定于 Windows 的。你可以File.basename。而且,像其他一些答案一样,不回答 OP 的问题。
【解决方案3】:

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"

【讨论】:

  • 问题在于你需要知道它是反斜杠还是正斜杠
【解决方案4】:
require 'pathname'

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

我很久没有成为 Windows 用户了,但是路径名 rdoc 说它在 Windows 上没有目录名称分隔符的问题。

【讨论】:

  • 当 File.basename 不需要额外的 'pathname' 'require' 时,我不知道为什么这是排名第一的答案。
  • Class pathname 使用本地路径名,而 File 始终假定 Unix 路径名(不同之处在于 MS Windows 中使用的路径和驱动器分隔符)
  • 尽管被 OP 接受,但这个答案实际上并没有回应 OP 的问题。请参阅 Jonathan Lonowski 和 Arup Rakshit 的答案。
  • 如果有扩展名,则存在该扩展名。答案是错误的。
  • 请不要破坏您自己的帖子。谢谢!
【解决方案5】:

如果扩展名未知(它需要 / 分隔符):

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"

【讨论】:

  • File.basename() 就是答案!
【解决方案6】:

如果您可以访问 ENV 变量,scan 结合这个小正则表达式(查找最后一个单词,一个点,然后是字符串的最后一个单词)会将文件名放入“文件名”:

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

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

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

【讨论】:

    【解决方案7】:

    您可以通过以下方式获取当前脚本的目录路径:

    File.dirname __FILE__
    

    【讨论】:

    • 问题不在于路径,而在于文件名。 "如何从 Ruby 中的文件路径中获取 文件名?"
    • 那就是:File.basename __FILE__
    【解决方案8】:

    Jonathan Lonowski 回答得很好,但是这里没有提到任何答案。代替File::extname,你可以直接使用'.*'来获取文件名。

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

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

    【讨论】:

      【解决方案9】:

      试试这个代码

      使用extname

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

      【讨论】:

        【解决方案10】:

        我个人更喜欢使用Pathname 和.*

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

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

        【讨论】:

          猜你喜欢
          • 2010-10-15
          • 1970-01-01
          • 2022-06-23
          • 1970-01-01
          • 1970-01-01
          • 2020-03-11
          • 2012-03-01
          • 2011-12-08
          相关资源
          最近更新 更多