Trova l'estensione di un nome di file in Ruby


103

Sto lavorando alla porzione di caricamento dei file di un'app Rails. Diversi tipi di file vengono gestiti in modo diverso dall'app.

Voglio creare una lista bianca di alcune estensioni di file per controllare i file caricati per vedere dove dovrebbero andare. Tutti i nomi di file sono stringhe.

Ho bisogno di un modo per controllare solo la parte dell'estensione della stringa del nome del file. I nomi dei file sono tutti nel formato "nome_file.some_estensione".

Risposte:


167

Questa è davvero roba di base:

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
Che ne dici "file_with_no_extension".split('.').last?
a'r

12
E 'un peccato questo non funziona per il multi-periodo di suffissi, come tar.gz, tar.bz2.
KomodoDave

2
@KomodoDave non funziona nulla per i suffissi multi-periodo, tranne un database di estensioni euristico (quindi soggetto a errori).
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

4
Dovresti File.extname("example.png").downcaseassicurarti che l'estensione non sia tutto maiuscolo
Sam Eaton

@CiroSantilli 六四 事件 法轮功 包 卓 轩 A meno che tu non scelga di includere qualcosa dopo il primo punto ... ma poi le persone creano nomi di file con punti, quindi sì, in entrambi i casi è soggetto a errori, d'accordo su questo.
Luc

78

Usa il extnamemetodo dalla classe File

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

Inoltre potrebbe essere necessario un basenamemetodo

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

16

Argomento abbastanza vecchio, ma ecco il modo per sbarazzarsi del punto separatore di estensione e dei possibili spazi finali:

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

Esempi:

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

Non sarebbe più facile farlo per ottenere il passaggio del separatore di estensione?

File.extname(path).delete('.')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.