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".

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

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"

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"

0

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

File.extname(path).delete('.')
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.