Хотя вы не можете сделать open
чувствителен к регистру, вы можете написать поиск каталога вы предложили довольно сжато. например
filename = Dir.glob('foo.txt', File::FNM_CASEFOLD).first
if filename
# use filename here
else
# no matching file
end
Обратите внимание, что в то время как documentation suggests that FNM_CASEFOLD can't be used with glob это кажется неправильным или устареть.
Альтернативы
Если вы обеспокоены использованием FNM_CASEFOLD
то пару альтернатив:
filename = Dir.glob('*').find { |f| f.downcase == 'foo.txt' }
или написать небольшой метод, чтобы построить регистрозависимости Glob для данного файла:
def ci_glob(filename)
glob = ''
filename.each_char do |c|
glob += c.downcase != c.upcase ? "[#{c.downcase}#{c.upcase}]" : c
end
glob
end
irb(main):024:0> ci_glob('foo.txt')
=> "[fF][oO][oO].[tT][xX][tT]"
, а затем вы можете сделать:
filename = Dir.glob(ci_glob('foo.txt')).first
Что делать, если несколько файлов совпадают? Выберите одного из них наугад? –
@ Игнасио: Да, это единственный разумный вариант. Но этот случай маловероятен в моей ситуации. – imgx64