Znajdź rozszerzenie nazwy pliku w Rubim

103

Pracuję nad częścią aplikacji Rails do wysyłania plików. Aplikacja obsługuje różne typy plików.

Chcę utworzyć białą listę niektórych rozszerzeń plików, aby porównać przesłane pliki, aby zobaczyć, gdzie powinny się znaleźć. Wszystkie nazwy plików są ciągami.

Potrzebuję sposobu, aby sprawdzić tylko część rozszerzenia ciągu nazwy pliku. Wszystkie nazwy plików mają format „jakaś_nazwa_pliku.s rozszerzenie_nazwa”.

Bryan Cosgrove
źródło

Odpowiedzi:

167

To naprawdę podstawowe rzeczy:

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
źródło
4
A co powiesz "file_with_no_extension".split('.').last?
a'r
12
To niefortunne, to nie działa dla wielu okres przyrostki takie jak tar.gz, tar.bz2.
KomodoDave
2
@KomodoDave nic nie działa dla wielookresowych sufiksów, z wyjątkiem heurystycznej (więc podatnej na błędy) bazy danych rozszerzeń.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
4
Chciałbyś zrobić, File.extname("example.png").downcaseaby upewnić się, że rozszerzenie nie jest we wszystkich przypadkach
Sam Eaton
@CiroSantilli 六四 事件 法轮功 包 卓 轩 Chyba że zdecydujesz się dołączyć cokolwiek po pierwszej kropce ... ale potem ludzie tworzą nazwy plików z kropkami, więc tak, tak czy inaczej, jest to podatne na błędy, zgodzili się co do tego.
Luc
78

Użyj extnamemetody z klasy File

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

Możesz też potrzebować basenamemetody

File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"
megas
źródło
16

Dość stary temat, ale oto sposób na pozbycie się kropki separatora rozszerzenia i możliwych spacji końcowych:

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

Przykłady:

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
źródło
0

Moim zdaniem łatwiej by było to zrobić żeby dostać jazdę z przedłużką separatora.

File.extname(path).delete('.')
NicoDev
źródło