Encontre a extensão de um nome de arquivo em Ruby

103

Estou trabalhando na parte de upload de arquivo de um aplicativo Rails. Diferentes tipos de arquivos são tratados de maneira diferente pelo aplicativo.

Quero fazer uma lista de permissões de certas extensões de arquivo para verificar os arquivos carregados e ver onde eles devem ir. Todos os nomes de arquivo são strings.

Preciso de uma maneira de verificar apenas a parte da extensão da string do nome do arquivo. Os nomes dos arquivos estão todos no formato de "some_file_name.some_extension".

Bryan Cosgrove
fonte

Respostas:

167

Isso é realmente básico:

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
Felix
fonte
4
Que tal "file_with_no_extension".split('.').last?
a'r
12
É lamentável que isso não funciona para multi-período de sufixos como tar.gz, tar.bz2.
KomodoDave
2
@KomodoDave nada funciona para sufixos de vários períodos, exceto um banco de dados heurístico (portanto sujeito a erros) de extensões.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
4
Convém fazer File.extname("example.png").downcasepara garantir que a extensão não esteja em maiúsculas
Sam Eaton
@CiroSantilli 六四 事件 法轮功 包 卓 轩 A menos que você escolha incluir qualquer coisa após o primeiro ponto ... mas então as pessoas criam nomes de arquivo com pontos, então sim, de qualquer maneira está sujeito a erros, concordamos nisso.
Luc
78

Use o extnamemétodo da classe File

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

Você também pode precisar de basenamemétodo

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

Tópico bastante antigo, mas aqui está a maneira de se livrar do ponto separador de extensão e possíveis espaços finais:

File.extname(path).strip.downcase[1..-1]

Exemplos:

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"
Gertas
fonte
0

Não seria mais fácil fazer isso para se livrar do separador de extensão?

File.extname(path).delete('.')
NicoDev
fonte