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

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

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"

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"

0

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

File.extname(path).delete('.')
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.