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

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

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"

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"

0

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

File.extname(path).delete('.')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.