Dir.chdir('/home')
Dir.chdir('/tmp') do
puts Dir.pwd # /tmp
# Какой-то код...
end
puts Dir.pwd # /home
10.1.29. Изменение текущего корня
В большинстве систем UNIX можно изменить «представление» процесса о том, что такое корневой каталог /
. Обычно это делается из соображений безопасности перед запуском небезопасной или непротестированной программы. Метод chroot
делает указанный каталог новым корнем:
Dir.chdir('/home/guy/sandbox/tmp')
Dir.chroot('/home/guy/sandbox')
puts Dir.pwd # '/tmp'
10.1.30. Обход каталога
Метод класса foreach
— это итератор, который последовательно передает в блок каждый элемент каталога. Точно так же ведет себя метод экземпляра each
.
Dir.foreach('/tmp') { |entry| puts entry }
dir = Dir.new('/tmp')
dir.each { |entry| puts entry }
Оба фрагмента печатают одно и то же (имена всех файлов и подкаталогов в каталоге /tmp).
10.1.31. Получение содержимого каталога
Метод класса Dir.entries
возвращает массив, содержащий все элементы указанного каталога:
list = Dir.entries('/tmp') # %w[. .. alpha.txt beta.doc]
Как видите, включаются и элементы, соответствующие текущему и родительскому каталогу. Если они вам не нужны, придется отфильтровать их вручную.
10.1.32. Создание цепочки каталогов
Иногда необходимо создать глубоко вложенный каталог, причем промежуточные каталоги могут и не существовать. В UNIX мы воспользовались бы для этого командой mkdir -p
.
В программе на Ruby такую операцию выполняет метод FileUtils.makedirs
(из библиотеки fileutils
):
require 'fileutils'
FileUtils.makedirs('/tmp/these/dirs/need/not/exist')
10.1.33. Рекурсивное удаление каталога
В UNIX команда rm -rf dir
удаляет все поддерево начиная с каталога dir
. Понятно, что применять ее надо с осторожностью.
В последних версиях Ruby в класс Pathname
добавлен метод rmtree
, решающий ту же задачу. В модуле FileUtils
есть аналогичный метода rm_r
.
require 'pathname'
dir = Pathname.new('/home/poole/')
dir.rmtree
# или:
require 'fileutils'
FileUtils.rm_r('/home/poole')
10.1.34. Поиск файлов и каталогов
Ниже мы воспользовались стандартной библиотекой find.rb
для написания метода, который находит один или более файлов и возвращает их список в виде массива. Первый параметр — это начальный каталог, второй — либо имя файла (строка), либо регулярное выражение.
require 'find'
def findfiles(dir, name)
list = []
Find.find(dir) do |path|
Find.prune if ['.','..'].include? Path
case name
when String
list << path if File.basename(path) == name
when Regexp
list << path if File.basename(path) =~ name
else
raise ArgumentError
end
end
list
end
findfiles '/home/hal', 'toc.txt'
# ['/home/hal/docs/toc.txt', '/home/hal/misc/toc.txt']
findfiles '/home', /^[a-z]+.doc/