В Ruby существует несколько методов рекурсивного извлечения файлов из каталога, исключая сами каталоги. В этой статье будут рассмотрены различные подходы и приведены примеры кода для каждого метода.
Метод 1: использование Dir.globс File.file?
files = Dir.glob('/*').select { |file| File.file?(file) }
Объяснение:
Метод Dir.globрекурсивно извлекает все файлы и каталоги. Применяя метод selectс условием File.file?, мы отфильтровываем каталоги и получаем только файлы.
Метод 2: использование Dir.globс File.directory?и отрицанием
files = Dir.glob('/*').reject { |file| File.directory?(file) }
Объяснение:
Как и в предыдущем методе, мы используем Dir.globдля получения всех файлов и каталогов. Однако на этот раз мы применяем метод rejectс условием File.directory?, чтобы исключить каталоги из результирующего списка файлов.
Метод 3: объединение Dir.globс модулем FileTest
files = Dir.glob('/*').reject { |file| FileTest.directory?(file) }
Объяснение:
Модуль FileTestпредоставляет набор удобных методов для тестов, связанных с файлами. В этом методе мы используем FileTest.directory?для исключения каталогов из списка файлов, полученного Dir.glob.
Метод 4: использование Find.findиз модуля «Поиск»
require 'find'
files = []
Find.find('.') do |path|
next if FileTest.directory?(path)
files << path
end
Объяснение:
Модуль Find в Ruby предоставляет мощный способ рекурсивного перемещения по каталогам. Используя метод Find.find, мы можем перебирать каждый файл и исключать каталоги, используя FileTest.directory?.
Метод 5. Реализация пользовательской рекурсивной функции
def get_files(path)
Dir.entries(path).flat_map do |entry|
next if entry == '.' || entry == '..'
full_path = File.join(path, entry)
File.directory?(full_path) ? get_files(full_path) : full_path
end.compact
end
files = get_files('.')
Объяснение:
Этот метод определяет специальную рекурсивную функцию get_files, которая обходит каталоги и собирает файлы, рекурсивно вызывая саму себя. Он отфильтровывает каталоги с помощью File.directory?и возвращает результирующий список файлов.
В этой статье мы рассмотрели несколько методов эффективного извлечения вложенных файлов в Ruby, исключая каталоги. Используя такие методы, как Dir.globс условными проверками, модуль поиска или реализацию собственной рекурсивной функции, вы получаете ряд возможностей, соответствующих вашим конкретным потребностям.