ค้นหานามสกุลของชื่อไฟล์ใน Ruby


103

ฉันกำลังทำงานในส่วนการอัปโหลดไฟล์ของแอป Rails แอปจะจัดการไฟล์ประเภทต่างๆแตกต่างกันไป

ฉันต้องการสร้างรายการนามสกุลไฟล์ที่อนุญาตพิเศษเพื่อตรวจสอบไฟล์ที่อัปโหลดเพื่อดูว่าควรไปที่ใด ชื่อไฟล์ทั้งหมดเป็นสตริง

ฉันต้องการวิธีตรวจสอบเฉพาะส่วนขยายของสตริงชื่อไฟล์ ชื่อไฟล์ทั้งหมดอยู่ในรูปแบบของ "some_file_name.some_extension"

คำตอบ:


167

นั่นเป็นสิ่งพื้นฐานจริงๆ:

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
แล้วไง"file_with_no_extension".split('.').last?
อา

12
มันโชคร้ายนี้ไม่ได้ทำงานให้กับหลายระยะเวลาที่ต่อท้ายเช่น,tar.gz tar.bz2
KomodoDave

2
@KomodoDave ไม่มีอะไรทำงานกับคำต่อท้ายหลายช่วงเวลายกเว้นฐานข้อมูลส่วนขยายแบบฮิวริสติก (จึงเกิดข้อผิดพลาด)
Ciro Santilli 郝海东冠状病六四事件法轮功

4
คุณต้องทำFile.extname("example.png").downcaseเพื่อให้แน่ใจว่าส่วนขยายไม่ได้อยู่ในตัวพิมพ์ใหญ่ทั้งหมด
Sam Eaton

@CiroSantilli 六四事件法轮功包卓轩เว้นแต่คุณเลือกที่จะรวมอะไรไว้หลังจากจุดแรก ...
ลัค

78

ใช้extnameวิธีการจากคลาสไฟล์

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

นอกจากนี้คุณอาจต้องbasenameใช้วิธีการ

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

16

หัวข้อค่อนข้างเก่า แต่นี่คือวิธีกำจัดจุดคั่นส่วนขยายและช่องว่างต่อท้ายที่เป็นไปได้:

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

ตัวอย่าง:

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

ฉันคิดว่าการทำเช่นนี้จะง่ายกว่าเพื่อให้ได้ตัวคั่นส่วนขยาย

File.extname(path).delete('.')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.