Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
•
ActiveDirectory•
ruby-inifileВ сети есть еще много библиотек, которые могут вам пригодиться. Ищите их на сайтах http://raa-ruby-lang.org и http://rubyforge.org.
14.8. Работа с файлами, каталогами и деревьями
При выполнении рутинных задач приходится много работать с файлами и каталогами, в том числе с целыми иерархиями каталогов. Немало материала на эту тему вошло в главу 4, но кое-какие важные моменты мы хотим осветить здесь.
Поскольку ввод/вывод — вещь системно-зависимая, то для различных систем приходится применять разные приемы. Если сомневаетесь, экспериментируйте!..
14.8.1. Несколько слов о текстовых фильтрах
Многие инструменты, которыми мы постоянно пользуемся (как поставляемые производителем, так и разрабатываемые собственными силами), — просто текстовые фильтры. Иными словами, они принимают на входе текст, каким-то образом преобразуют его и выводят. Классическими примерами текстовых фильтров в UNIX служат, в частности, программы
sedtrИногда файл настолько мал, что целиком помещается в памяти. В этом случае возможны такие виды обработки, которые по-другому было бы сложно реализовать.
file = File.open(filename)lines = file.readlines# Какие-то операции...lines.each { |x| puts x }Бывает, что нужно обрабатывать файл построчно.
IO.foreach(filename) do |line| # Какие-то операции... puts lineendНаконец, не забывайте, что все имена файлов, указанные в командной строке, автоматически собираются в объект
ARGFARGF.readlinesARGFIO14.8.2. Копирование дерева каталогов (с символическими ссылками)
Пусть нужно скопировать целое дерево каталогов в новое место. Сделать это можно по-разному, но если в дереве есть символические ссылки, задача усложняется.
В листинге 14.5 приведено рекурсивное решение. Оно достаточно дружелюбно — контролирует входные данные и выводит информацию о порядке запуска.
require "fileutils"def recurse(src, dst) Dir.mkdir(dst) Dir.foreach(src) do |e| # Пропустить . и .. next if [".",".."].include? e fullname = src + "/" + e newname = fullname.sub(Regexp.new(Regexp.escape(src)),dst) if FileTest:rdirectory?(fullname) recurse(fullname,newname) elsif FileTest::symlink?(fullname) linkname = 'ls -l #{fullname}'.sub(/.* -> /,"").chomp newlink = linkname.dup n = newlink.index($oldname) next if n == nil n2 = n + $oldname.length - 1 newlink[n..n2] = $newname newlink.sub!(////,"/") # newlink = linkname.sub(Regexp.new(Regexp.escape(src)),dst) File.symlink(newlink, newname) elsif FileTest::file?(fullname) FileUtils.copy(fullname, newname) else puts "??? : #{fullname}" end endend# "Главная программа"if ARGV.size != 2 puts "Usage: copytree oldname newname" exitendoldname = ARGV[0]newname = ARGV[1]if ! FileTest::directory?(oldname) puts "Ошибка: первый параметр должен быть именем существующего каталога." exitendif FileTest::exist? (newname) puts "Ошибка: #{newname} уже существует." exitendoldname = File.expand_path(oldname)newname = File.expand_path(newname)$оldname=oldname$newname=newnamerecurse(oldname, newname)Возможно, и существуют варианты UNIX, в которых команда
cp -R14.8.3. Удаление файлов по времени модификации и другим критериям
Предположим, вы хотите удалить самые старые файлы из какого-то каталога. В нем могут, к примеру, храниться временные файлы, протоколы, кэш браузера и т.п.
Ниже представлена небольшая программа, удаляющая файлы, которые в последний раз модифицировались раньше указанного момента (заданного в виде объекта
Timedef delete_older(dir, time)
