Найдите расширение имени файла в Ruby

103

Я работаю над загрузкой файлов в приложении Rails. Приложение по-разному обрабатывает файлы разных типов.

Я хочу составить белый список определенных расширений файлов, чтобы проверять загруженные файлы, чтобы увидеть, куда они должны идти. Все имена файлов представляют собой строки.

Мне нужен способ проверить только часть расширения строки имени файла. Имена файлов имеют формат «какое-то_имя_файла.Некоторое_расширение».

Брайан Косгроув
источник

Ответы:

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?
a'r
12
Очень жаль , это не работает для несколько периода суффиксов , таких как tar.gz, tar.bz2.
KomodoDave
2
@KomodoDave ничего не работает для многопериодных суффиксов, кроме эвристической (а значит, подверженной ошибкам) ​​базы данных расширений.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
4
Вы бы хотели сделать так, File.extname("example.png").downcaseчтобы расширение не было написано заглавными буквами
Сэм Итон
@CiroSantilli 六四 事件 法轮功 包 卓 轩 Если только вы не решите добавить что-либо после первой точки ... но потом люди создают имена файлов с точками, так что да, в любом случае возможны ошибки, согласен с этим.
Люк
78

Использовать extnameметод из класса File

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('.')
NicoDev
источник