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

Bryan Cosgrove
quelle

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
Felix
quelle
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"
Megas
quelle
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"
gertas
quelle
0

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

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