Temukan ekstensi nama file di Ruby

103

Saya sedang mengerjakan bagian unggah file dari aplikasi Rails. Jenis file yang berbeda ditangani secara berbeda oleh aplikasi.

Saya ingin membuat daftar putih dari ekstensi file tertentu untuk memeriksa file yang diunggah untuk melihat ke mana mereka harus pergi. Semua nama file adalah string.

Saya perlu cara untuk memeriksa hanya bagian ekstensi dari string nama file. Semua nama file dalam format "some_file_name.some_extension".

Bryan Cosgrove
sumber

Jawaban:

167

Itu hal yang sangat mendasar:

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
sumber
4
Bagaimana dengan "file_with_no_extension".split('.').last?
1111
12
Ini disayangkan ini tidak bekerja untuk multi-periode akhiran seperti tar.gz, tar.bz2.
KomodoDave
2
@KomodoD tidak ada yang berfungsi untuk sufiks multi-periode, kecuali database ekstensi heuristik (dengan demikian rawan kesalahan).
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
4
Anda ingin File.extname("example.png").downcasememastikan bahwa ekstensi tidak dalam huruf besar semua
Sam Eaton
@CiroSantilli 六四 事件 法轮功 包 卓 轩 Kecuali jika Anda memilih untuk menyertakan apa pun setelah titik pertama ... tetapi kemudian orang membuat nama file dengan titik, jadi ya, bagaimanapun, rawan kesalahan, setujui itu.
Luc
78

Gunakan extnamemetode dari kelas File

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

Anda juga mungkin membutuhkan basenamemetode

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

Topik yang cukup lama tetapi berikut adalah cara untuk menghilangkan titik pemisah ekstensi dan kemungkinan spasi tambahan:

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

Contoh:

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

Bukankah lebih mudah melakukan ini untuk mendapatkan tumpangan dari pemisah ekstensi?

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