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

dy2hfwbg  于 2023-10-17  发布在  Ruby
关注(0)|答案(6)|浏览(145)

我正在做一个Rails应用的文件上传部分。不同类型的文件由应用程序以不同的方式处理。
我想做一个白名单的某些文件扩展名,以检查上传的文件,看看他们应该去。所有文件名都是字符串。
我需要一种方法来只检查文件名字符串的扩展名部分。文件名都是“some_file_name.some_extension”格式。

g6baxovj

g6baxovj1#

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
wlp8pajw

wlp8pajw2#

使用File类中的extname方法

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

您可能需要basename方法

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

k4ymrczo3#

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

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

y3bcpkx14#

我认为这样做会更容易摆脱扩展分隔符。

File.extname(path).delete('.')
pxyaymoc

pxyaymoc5#

还有一种方法,使用delete_suffixdelete_prefix。这更容易阅读,IMO。

filename = 'path/to/file.ext'
file_name_only = File.basename(filename).delete_suffix(File.extname(filename))
file_ext = File.extname(filename).delete_prefix '.'
file_path = File.dirname(filename)
new_name = "#{file_path}/#{file_name_only}_blahblah.#{file_ext}"

在IRB中:

$ irb
irb(main):001:0> filename = 'path/to/file.ext'
=> "path/to/file.ext"
irb(main):002:0> file_name_only = File.basename(filename).delete_suffix(File.extname(filename))
=> "file"
irb(main):003:0> file_ext = File.extname(filename).delete_prefix '.'
=> "ext"
irb(main):004:0> file_path = File.dirname(filename)
=> "path/to"
irb(main):005:0> new_name = "#{file_path}/#{file_name_only}_blahblah.#{file_ext}"
=> "path/to/file_blahblah.ext"
irb(main):006:0>
ny6fqffe

ny6fqffe6#

这篇文章回答了我的问题,但我的用例是相反的。我想找到没有扩展名的文件名。我发现文件名为File.basename,然后将File.extnamegsub组合以删除.md,如下所示:

@file = '/path/to/my-file-name.md' 
File.basename(@file).gsub(File.extname(@file),'')

# => 'my-file-name'

相关问题