• FreeRIDE — интегрированная среда разработки для Ruby с встроенным редактором, обозревателем исходных текстов и отладчиком (работа над совершенствованием этой программы ведется постоянно);
• SciTE — текстовый редактор на базе Scintilla;
• SWin и VRuby — инструменты для обработки сообщений Windows и разработки графических интерфейсов (обе являются частью проекта VisualuRuby, во главе которого стоит Ясухира Насикава);
• два анализатора XML (XMLParser и Expat), а также HTMLParser;
• библиотеки для работы с базами данных RubyDBI и DBD/ODBC;
• прочие библиотеки и инструменты, в том числе log4r
, zlib
, OpenSSL
, Iconv
, readline
и другие.
Планируются, но еще не готовы варианты этого инсталлятора и для других платформ.
14.7. Библиотеки, о которых полезно знать
Если вы программируете на Ruby в Windows, вам абсолютно необходим пакет, созданный Дэниэлем Бергером (Daniel Berger), одним из самых известных специалистов по Ruby на этой платформе. Библиотека win32-utils
— в действительности целый набор мелких библиотек. Мы не можем рассмотреть их все подробно, но хотя бы перечислим.
• win32-changenotify
— для мониторинга событий файловой системы;
• win32-clipboard
— для взаимодействия с буфером обмена Windows;
• win32-etc
— предоставляет аналоги таких UNIX-функций, как getpwnam
и getpwuid
;
• win32-event
— интерфейс с событиями Windows (объектами Event);
• win32-eventlog
— интерфейс с журналом событий;
• win32-ipc
— базовый класс для всех объектов синхронизации в Windows (используется в библиотеке win32-event
и др.);
• win32-mmap
— интерфейс к файлам, проецируемым на память, в Windows;
• win32-open3
— библиотека open3
для Windows (запустить команды и получить три описателя файлов);
• win32-pipe
— именованные каналы в Windows;
• win32-process
— реализация для Windows методов fork
, wait
и kill
, имеющихся в UNIX;
• win32-sapi
— интерфейс к Microsoft Speech API;
• win32-service
— интерфейс к службам Windows;
• win32-shortcut
— интерфейс для создания и модификации ярлыков в Windows;
• win32-sound
— интерфейс для воспроизведения звуковых файлов в Windows;
Вот еще несколько библиотек, которые полезно иметь под рукой:
• Win32::Console
— это перенос пакетов Win32::Console и Win32::Console::ANSI, первоначально написанных на языке Perl. Эта библиотека значительно упрощает работу с консолью в Windows (изменение цветов, позиционирование курсора, запрос информации и эмуляцию управляющих символов ANSI);
• ActiveDirectory
позволяет легко взаимодействовать с экземплярами Active Directory, работающими на серверах под управлением Microsoft Windows;
• ruby-inifile
позволяет работать с ini-файлами (читать, разбирать и обновлять их).
В сети есть еще много библиотек, которые могут вам пригодиться. Ищите их на сайтах http://raa- ruby-lang.org и http://rubyforge.org.
14.8. Работа с файлами, каталогами и деревьями
При выполнении рутинных задач приходится много работать с файлами и каталогами, в том числе с целыми иерархиями каталогов. Немало материала на эту тему вошло в главу 4, но кое-какие важные моменты мы хотим осветить здесь.
Поскольку ввод/вывод — вещь системно-зависимая, то для различных систем приходится применять разные приемы. Если сомневаетесь, экспериментируйте!..
14.8.1. Несколько слов о текстовых фильтрах
Многие инструменты, которыми мы постоянно пользуемся (как поставляемые производителем, так и разрабатываемые собственными силами), — просто текстовые фильтры. Иными словами, они принимают на входе текст, каким-то образом преобразуют его и выводят. Классическими примерами текстовых фильтров в UNIX служат, в частности, программы sed
и tr
.
Иногда файл настолько мал, что целиком помещается в памяти. В этом случае возможны такие виды обработки, которые по-другому было бы сложно реализовать.
file = File.open(filename)
lines = file.readlines
# Какие-то операции...
lines.each { |x| puts x }
Бывает, что нужно обрабатывать файл построчно.
IO.foreach(filename) do |line|
# Какие-то операции...
puts line
end
Наконец, не забывайте, что все имена файлов, указанные в командной строке, автоматически собираются в объект ARGF
, представляющий конкатенацию всех выходных данных (см. раздел 14.2.2). Мы можем вызывать, к примеру, метод ARGF.readlines
, как если бы ARGF
был объектом класса IO
. Вся выходная информация будет, как обычно, направлена на стандартный вывод.
14.8.2. Копирование дерева каталогов (с символическими ссылками)
Пусть нужно скопировать целое дерево каталогов в новое место. Сделать это можно по-разному, но если в дереве есть символические ссылки, задача усложняется.
В листинге 14.5 приведено рекурсивное решение. Оно достаточно дружелюбно — контролирует входные данные и выводит информацию о порядке запуска.
require 'fileutils'
def recurse(src, dst)
Dir.mkdir(dst)
Dir.foreach(src) do |e|