Как проверить, содержит ли каталог файл .pdf в Ruby?

#ruby #file #pdf

Вопрос:

Многие люди присылают мне свои счета, и они почти всегда представляют собой файлы .pdf. У меня ограниченный объем внимания, и поэтому я написал некоторый код ruby, чтобы мне не приходилось смотреть на них. Было бы полезно, если бы мой фрагмент кода Ruby заглянул в папку и, если там был счет, вернул имя файла и его путь. Дело в том, что люди, которые присылают мне свои счета, очень раздражают и называют свои файлы наихудшим образом. Например, один из них предоставил мне счет-фактуру под названием «Invoice_Cost_Centre_6454537.pdf». Нельзя ожидать, что я запомню такое имя. Однако они всегда (почти) .pdf-файлы. Я собирался поговорить об этом с Руби, и она сказала следующее,

 File.exist?('testInvoice_Cost_Centre_61356.pdf')
#=> true

File.exists?('test*.pdf')
#=> false 
 

Я просмотрел документы для File класса и подумал, что File.fnmatch?(pattern, path) это может быть решением, но я не смог заставить его работать.

Я был бы признателен за любую помощь. Я довольно новичок в Ruby, поэтому, пожалуйста, сокращайте свои предложения.

Комментарии:

1. «Я не смог заставить его работать» — недостаточно точное описание ошибки, чтобы мы могли вам помочь. Что не работает? Как это не работает? Какие проблемы у вас с вашим кодом? Вы получаете сообщение об ошибке? В чем заключается сообщение об ошибке? Является ли результат, который вы получаете, не тем результатом, которого вы ожидаете? Какого результата вы ожидаете и почему, какой результат вы получаете и чем они отличаются? Является ли поведение, которое вы наблюдаете, не желаемым поведением? Каково желаемое поведение и почему, каково наблюдаемое поведение и в чем они отличаются?

2. @desdinthewater : Я предлагаю использовать косые черты в качестве разделителя путей. Это избавляет вас от необходимости рассматривать случаи, когда обратная косая черта используется для экранирования последующего символа. Кроме того, Dir.glob("directory/*.pdf") это вернет вам массив всех имен, заканчивающихся на .pdf в этом каталоге.

3. Это очень длинное объяснение такого маленького вопроса: -)

4. Что я могу сказать? Я болтун в изоляции

5. Спасибо всем, я нашел ответ Ндненкова наводящим на размышления. — И я потратил немного времени на чтение заметок по классу в Справочнике. В конце концов, ответ @user1934428 был самым простым, и получение массива обратно весьма полезно. Отвечая Йоргу Миттагу, я не был уверен, что нахожусь на правильном пути ( это подтвердили ндненков и пользователь1934428), и, как отметил Стефан, я могу быть немного запыхавшимся. Ответы на все ваши вопросы к вашему полному удовлетворению могли бы занять значительное время. Еще раз спасибо всем.

Ответ №1:

File.exists? проверяет, существует ли файл с таким путем дословно.

File.fnmatch? проверяет, соответствует ли путь заданному шаблону, но на самом деле не ищет этот путь.

Вместо этого вы могли бы Dir['test/*.pdf'].empty?

Комментарии:

1. Поскольку пользователь хочет проверить наличие, это, вероятно Dir['test/*.pdf'].any? (или Dir['*.pdf', base: 'test'].any? для разделения каталога и шаблона файла)