Следует знать о существовании стандартной библиотеки pathname, которая предоставляет класс Pathname. В сущности, это обертка вокруг классов Dir, File, FileTestи FileUtils, поэтому он комбинирует многие их функции логичным и интуитивно понятным способом.
path = Pathname.new("/home/hal")
file = Pathname.new("file.txt")
p2 = path + file
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"
Читать дальше
Конец ознакомительного отрывка
Купить книгу