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

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

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"

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"

0

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

File.extname(path).delete('.')
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.