Ruby'de bir dosya adının uzantısını bulun


103

Bir Rails uygulamasının dosya yükleme kısmı üzerinde çalışıyorum. Farklı dosya türleri uygulama tarafından farklı şekilde ele alınır.

Yüklenen dosyaları nereye gitmeleri gerektiğini görmek için kontrol etmek üzere belirli dosya uzantılarından oluşan bir beyaz liste yapmak istiyorum. Tüm dosya adları dizelerdir.

Dosya adı dizesinin yalnızca uzantı kısmını kontrol etmek için bir yola ihtiyacım var. Dosya adlarının tümü "bir_dosya_adı.some_uzantısı" biçimindedir.

Yanıtlar:


167

Bu gerçekten temel şeyler:

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
Nasıl olur "file_with_no_extension".split('.').last?
a'r

12
Bu tar.gz, gibi çok dönemli son ekler için çalışmaması talihsiz bir durumdur tar.bz2.
KomodoDave

2
@KomodoDave, sezgisel (dolayısıyla hataya açık) uzantı veritabanı dışında, çok dönemli son ekler için hiçbir şey çalışmaz.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

4
File.extname("example.png").downcaseUzantının tamamen büyük
Sam Eaton

@CiroSantilli 六四 事件 法轮功 包 卓 轩 İlk noktadan sonra herhangi bir şey eklemeyi seçmezseniz ... ama sonra insanlar noktalı dosya adları oluşturur, yani evet, her iki şekilde de hataya açık, bunda hemfikir.
Luc

78

extnameFile sınıfındaki yöntemi kullanın

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

Ayrıca basenameyönteme ihtiyacınız olabilir

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

16

Oldukça eski bir konu ama işte uzantı ayırıcı noktasından ve olası sondaki boşluklardan kurtulmanın yolu:

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

Örnekler:

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

Bence uzatma ayırıcısını kullanmak için bunu yapmak daha kolay olurdu.

File.extname(path).delete('.')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.