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

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

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"

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"

0

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

File.extname(path).delete('.')
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.