Знайдіть розширення імені файлу в Ruby


103

Я працюю над частиною завантаження файлу програми Rails. Додаток обробляє різні типи файлів по-різному.

Я хочу скласти білий список певних розширень файлів, щоб перевірити завантажені файли, щоб побачити, куди вони повинні йти. Усі назви файлів - це рядки.

Мені потрібен спосіб перевірити лише розширення частини рядка імені файлу. Усі імена файлів у форматі "some_file_name.some_extension".

Відповіді:


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 нічого не працює для багатоперіодних суфіксів, крім евристичної (таким чином, схильної до помилок) бази даних розширень.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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.