2008-12-17 86 views
212

如何从Ruby中的文件路径获取文件名?如何从Ruby文件路径中获得文件名无扩展名

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

Ruby中是否有LastIndexOf方法?

+3

请记住,没有什么特别的点,然后一些(三级,也许是)字符。它们是文件名称的一部分。一些边缘操作系统认为文件名的某个部分有特殊之处,但不应该陷入这个陷阱。 – 2012-06-04 00:20:45

回答

90
require 'pathname' 

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

我还没有一个Windows用户在很长一段时间,但路径名的RDoc说,它与Windows目录名称分隔符没有问题。

+76

我不知道为什么这是排名第一的答案,当File.basename不需要额外的'require''pathname'。 – GroovyCakes 2012-08-29 23:58:36

+10

class`pathname`使用本地路径名而File一直采用Unix路径名(不同之处在于MS Windows中使用的路径和驱动器分隔符) – nimrodm 2012-12-21 16:50:56

564

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

对于Linux和Ruby 1.8,我尝试使用`Pathname.new(“some/path/to/my.file”)。basename`并获取`my.file /`:'( – 2010-02-05 10:59:24

+57

更一般地说,`File.basename(“C :\\ projects \\ blah.dll“,”。*“)#=>”blah“` – kelloti 2012-03-25 23:22:57

3

注意的是双引号字符串逃过\'s。

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

将它纯粹作为一个字符串,而不是一个路径,使得代码的可移植性降低。 – boatcoder 2010-11-21 21:58:27

7

乔纳森的回答是好,但让你知道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

问题在于你需要知道它是反斜杠还是正斜杠 – 2013-09-25 10:33:36

53

万一不知道分机(它需要/分隔符):

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" 
0

如果你有机会获得ENV变量,scan结合这个小正则表达式(其中找到了最后,只有一个词,一个点,则该字符串的最后一个字),将会把该文件的名称为“文件名”:

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

很明显,你可以使用scan和包含文件名的路径名正则表达式,并__FILE__是显而易见的选择:

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

你可以得到目录路径当前的脚本:

File.dirname __FILE__ 
19

Jonathan Lonowski完美的回答,但就是没有一个答案在这里提到的某些东西。而不是File::extname,您可以直接使用'.*'来获取文件名。

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

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

8

试试这个代码

使用extname

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