Encuentra la extensión de un nombre de archivo en Ruby

103

Estoy trabajando en la parte de carga de archivos de una aplicación Rails. La aplicación maneja diferentes tipos de archivos de manera diferente.

Quiero hacer una lista blanca de ciertas extensiones de archivo para comparar los archivos cargados y ver dónde deben ir. Todos los nombres de archivo son cadenas.

Necesito una forma de verificar solo la parte de extensión de la cadena del nombre del archivo. Los nombres de los archivos están todos en el formato "some_file_name.some_extension".

Bryan Cosgrove
fuente

Respuestas:

167

Eso es algo 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
fuente
4
¿Qué tal "file_with_no_extension".split('.').last?
2011
12
Es desafortunado que esto no funciona para múltiples períodos sufijos como tar.gz, tar.bz2.
KomodoDave
2
@KomodoDave nada funciona para sufijos de períodos múltiples, excepto una base de datos heurística (por lo tanto propensa a errores) de extensiones.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
4
Querría hacer File.extname("example.png").downcasepara asegurarse de que la extensión no esté en mayúsculas
Sam Eaton
@CiroSantilli 六四 事件 法轮功 包 卓 轩 A menos que elijas incluir algo después del primer punto ... pero luego la gente crea nombres de archivo con puntos, así que sí, de cualquier manera es propenso a errores, de acuerdo en eso.
Luc
78

Usar extnamemétodo de la clase File

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

También puede necesitar un basenamemétodo

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

Un tema bastante antiguo, pero esta es la forma de deshacerse del punto separador de extensión y los posibles espacios finales:

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

Ejemplos:

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
fuente
0

¿No sería más fácil hacer esto para montar el separador de extensión?

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