Trouvez l'extension d'un nom de fichier dans Ruby

103

Je travaille sur la partie de téléchargement de fichiers d'une application Rails. Différents types de fichiers sont traités différemment par l'application.

Je souhaite créer une liste blanche de certaines extensions de fichiers pour vérifier les fichiers téléchargés pour voir où ils doivent aller. Tous les noms de fichiers sont des chaînes.

J'ai besoin d'un moyen de vérifier uniquement la partie d'extension de la chaîne de nom de fichier. Les noms de fichiers sont tous au format "some_file_name.some_extension".

Bryan Cosgrove
la source

Réponses:

167

Ce sont des choses vraiment basiques:

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
Félix
la source
4
Et pourquoi pas "file_with_no_extension".split('.').last?
2011
12
Il est regrettable cela ne fonctionne pas pour suffixes multipériode tels que tar.gz, tar.bz2.
KomodoDave
2
@KomodoDave rien ne fonctionne pour les suffixes multi-périodes, sauf une base de données heuristique (donc sujette aux erreurs) d'extensions.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
4
Vous voudriez faire pour vous File.extname("example.png").downcaseassurer que l'extension n'est pas en majuscules
Sam Eaton
@CiroSantilli 六四 事件 法轮功 包 卓 轩 À moins que vous ne choisissiez d'inclure quoi que ce soit après le premier point ... mais alors les gens créent des noms de fichiers avec des points, alors oui, dans les deux cas, il y a des erreurs, d'accord.
Luc
78

Utiliser la extnameméthode de la classe File

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

Vous pouvez également avoir besoin d'une basenameméthode

File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"
méga
la source
16

Sujet assez ancien, mais voici le moyen de se débarrasser du point de séparation d'extension et des éventuels espaces de fin:

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

Exemples:

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
la source
0

Ne serait-il pas plus facile de faire cela pour utiliser le séparateur d'extension?

File.extname(path).delete('.')
NicoDev
la source