我正在做一个Rails应用的文件上传部分。不同类型的文件由应用程序以不同的方式处理。我想做一个白名单的某些文件扩展名,以检查上传的文件,看看他们应该去。所有文件名都是字符串。我需要一种方法来只检查文件名字符串的扩展名部分。文件名都是“some_file_name.some_extension”格式。
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
wlp8pajw2#
使用File类中的extname方法
extname
File.extname("test.rb") #=> ".rb"
您可能需要basename方法
basename
File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
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"
y3bcpkx14#
我认为这样做会更容易摆脱扩展分隔符。
File.extname(path).delete('.')
pxyaymoc5#
还有一种方法,使用delete_suffix和delete_prefix。这更容易阅读,IMO。
delete_suffix
delete_prefix
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>
ny6fqffe6#
这篇文章回答了我的问题,但我的用例是相反的。我想找到没有扩展名的文件名。我发现文件名为File.basename,然后将File.extname与gsub组合以删除.md,如下所示:
File.basename
File.extname
gsub
.md
@file = '/path/to/my-file-name.md' File.basename(@file).gsub(File.extname(@file),'') # => 'my-file-name'
6条答案
按热度按时间g6baxovj1#
wlp8pajw2#
使用File类中的
extname
方法您可能需要
basename
方法k4ymrczo3#
这是一个很老的主题,但这里是摆脱扩展分隔符点和可能的尾随空格的方法:
示例如下:
y3bcpkx14#
我认为这样做会更容易摆脱扩展分隔符。
pxyaymoc5#
还有一种方法,使用
delete_suffix
和delete_prefix
。这更容易阅读,IMO。在IRB中:
ny6fqffe6#
这篇文章回答了我的问题,但我的用例是相反的。我想找到没有扩展名的文件名。我发现文件名为
File.basename
,然后将File.extname
与gsub
组合以删除.md
,如下所示: