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/

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату