path.directory?     # true

path.file?          # false

p2.directory?       # false

p2.file?            # true

parts = path2.split # [Путевое имя:/home/hal, Путевое имя:file.txt]

ext = path2.extname # .txt

Как и следовало ожидать, имеется ряд вспомогательных методов. Метод root? пытается выяснить, относится ли данный путь к корневому каталогу, но его можно «обмануть», так как он просто анализирует строку, не обращаясь к файловой системе. Метод parent? возвращает путевое имя родительского каталога данного пути. Метод children возвращает непосредственных потомков каталога, заданного своим путевым именем; в их число включаются как файлы, так и каталоги, но рекурсивного спуска не производится.

p1 = Pathname.new('//') # Странно, но допустимо.

p1.root?                # true

р2 = Pathname.new('/home/poole')

p3 = p2.parent          # Путевое имя:/home

items = p2.children     # Массив объектов Pathname

                        # (все файлы и каталоги, являющиеся

                        # непосредственными потомками р2).

Как и следовало ожидать, методы relative и absolute пытаются определить, является ли путь относительным или абсолютным (проверяя, есть ли в начале имени косая черта):

p1 = Pathname.new('/home/dave')

p1.absolute? # true

p1.relative? # false

Многие методы, например size, unlink и пр., просто делегируют работу классам File, FileTest и FileUtils; повторно функциональность не реализуется.

Дополнительную информацию о классе Pathname вы найдете на сайте ruby-doc.org или в любом другом справочном руководстве.

10.1.19. Манипулирование файлами на уровне команд

Часто приходится манипулировать файлами так, как это делается с помощью командной строки: копировать, удалять, переименовывать и т.д.

Многие из этих операций реализованы встроенными методами, некоторые находятся в модуле FileUtils из библиотеки fileutils. Имейте в виду, что раньше функциональность модуля FileUtils подмешивалась прямо в класс File; теперь эти методы помещены в отдельный модуль.

Для удаления файла служит метод File.delete или его синоним File.unlink:

File.delete('history')

File.unlink('toast')

Переименовать файл позволяет метод File.rename:

File.rename('Ceylon','SriLanka')

Создать ссылку на файл (физическую или символическую) позволяют методы File.link и File.symlink соответственно:

File.link('/etc/hosts','/etc/hostfile') # Физическая ссылка.

File.symlink('/etc/hosts','/tmp/hosts') # Символическая ссылка.

Файл можно усечь до нулевой длины (или до любой другой), воспользовавшись методом экземпляра truncate:

File.truncate('myfile',1000) # Теперь не более 1000 байтов.

Два файла можно сравнить с помощью метода compare_file. У него есть синонимы cmp и compare_stream:

require 'fileutils'

same = FileUtils.compare_file('alpha','beta') # true

Метод copy копирует файл в другое место, возможно, с переименованием. У него есть необязательный флаг, говорящий, что сообщения об ошибках нужно направлять на стандартный вывод для ошибок. Синоним — привычное для программистов UNIX имя cp.

require 'fileutils'

# Скопировать файл epsilon в theta с протоколированием ошибок.

FileUtils.сору('epsilon','theta', true)

Файл можно перемещать методом move (синоним mv). Как и сору, этот метод имеет необязательный параметр, включающий вывод сообщений об ошибках.

require 'fileutils'

FileUtils.move( '/trap/names', '/etc') # Переместить в другой каталог.

FileUtils.move('colours','colors')     # Просто переименовать.

Метод safe_unlink удаляет один или несколько файлов, предварительно пытаясь сделать их доступными для записи, чтобы избежать ошибок. Если последний параметр равен true или false, он интерпретируется как флаг, задающий режим вывода сообщений об ошибках.

require 'fileutils'

FileUtils.safe_unlink('alpha','beta','gamma')

# Протоколировать ошибки при удалении следующих двух файлов:

FileUtils.safe_unlink('delta','epsilon',true)

Наконец, метод install делает практически то же, что и syscopy, но сначала проверяет, что целевой файл либо не существует, либо содержит такие же данные.

require 'fileutils'

FileUtils.install('foo.so','/usr/lib')

# Существующий файл foo.so не будет переписан,

# если он не отличается от нового.

Дополнительную информацию о модуле FileUtils см. на сайте ruby-doc.org или в любом другом справочном руководстве.

10.1.20. Ввод символов с клавиатуры

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

Это можно сделать и в UNIX, и в Windows, но, к сожалению, совершенно по-разному.

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

0

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

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