在Ruby中找到文件名的扩展名


103

我正在研究Rails应用程序的文件上传部分。应用程序对不同类型的文件的处理方式不同。

我想将某些文件扩展名列入白名单,以检查上载的文件以查看它们应该去的位置。所有文件名都是字符串。

我需要一种方法来仅检查文件名字符串的扩展名部分。文件名均采用“ some_file_name.some_extension”的格式。

Answers:


167

这真的是最基本的东西:

irb(main):002:0> accepted_formats = [".txt", ".pdf"]
=> [".txt", ".pdf"]
irb(main):003:0> File.extname("example.pdf") # get the extension
=> ".pdf"
irb(main):004:0> accepted_formats.include? File.extname("example.pdf")
=> true
irb(main):005:0> accepted_formats.include? File.extname("example.txt")
=> true
irb(main):006:0> accepted_formats.include? File.extname("example.png")
=> false

4
怎么"file_with_no_extension".split('.').last
2011年

12
不幸的是,这对于多句号后缀(tar.gz,)无效tar.bz2
KomodoDave 2012年

2
@KomodoDave不适用于多期间后缀,除了扩展的启发式数据库(因此容易出错)。
Ciro Santilli郝海东冠状病六四事件法轮功

4
您可能想要File.extname("example.png").downcase确保扩展名不大写
Sam Eaton

@CiroSantilli六四事件法轮功包卓轩除非您选择在第一个点之后添加任何内容,否则人们会用点创建文件名,因此,是的,这两种方法都容易出错,对此表示同意。
卢克

78

extnameFile类的使用方法

File.extname("test.rb")         #=> ".rb"

另外你可能需要basename方法

File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"

16

很老的话题,但是这是摆脱扩展分隔符点和可能的尾随空格的方法:

File.extname(path).strip.downcase[1..-1]

例子:

File.extname(".test").strip.downcase[1..-1]       # => nil
File.extname(".test.").strip.downcase[1..-1]      # => nil
File.extname(".test.pdf").strip.downcase[1..-1]   # => "pdf"
File.extname(".test.pdf ").strip.downcase[1..-1]  # => "pdf"

0

这样做会不会更容易获得扩展分隔符的支持?

File.extname(path).delete('.')
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.