Найдите расширение имени файла в 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('.')
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.