Suchen Sie die Erweiterung eines Dateinamens in Ruby


103

Ich arbeite am Datei-Upload-Teil einer Rails-App. Verschiedene Dateitypen werden von der App unterschiedlich behandelt.

Ich möchte eine Whitelist bestimmter Dateierweiterungen erstellen, um die hochgeladenen Dateien zu überprüfen und festzustellen, wohin sie gehen sollen. Alle Dateinamen sind Zeichenfolgen.

Ich brauche eine Möglichkeit, nur den Erweiterungsteil der Dateinamenzeichenfolge zu überprüfen. Die Dateinamen haben alle das Format "some_file_name.some_extension".

Antworten:


167

Das ist wirklich grundlegendes Zeug:

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
Wie wäre es "file_with_no_extension".split('.').last?
Am

12
Es ist bedauerlich, dass dies bei mehrperiodischen Suffixen wie tar.gz, tar.bz2.
KomodoDave

2
@KomodoDave Für Mehrperioden-Suffixe funktioniert nichts außer einer heuristischen (also fehleranfälligen) Datenbank mit Erweiterungen.
Ciro Santilli 法轮功 冠状 病 六四 事件 24

4
Sie möchten File.extname("example.png").downcasesicherstellen, dass die Erweiterung nicht in Großbuchstaben angezeigt wird
Sam Eaton,

@CiroSantilli 轩 事件 法轮功 包 卓 轩 Es sei denn, Sie möchten nach dem ersten Punkt etwas einfügen ... aber dann erstellen die Leute Dateinamen mit Punkten.
Luc

78

Verwenden Sie die extnameMethode aus der Dateiklasse

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

Möglicherweise benötigen Sie auch eine basenameMethode

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

16

Ein ziemlich altes Thema, aber hier ist der Weg, um den Punkt des Erweiterungstrennzeichens und mögliche nachfolgende Leerzeichen zu entfernen:

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

Beispiele:

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

Wäre es nicht einfacher, dies zu tun, um den Verlängerungsabscheider zu fahren?

File.extname(path).delete('.')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.