Книга: Программирование на языке Ruby
10.1.12. Опрос специальных свойств файла
10.1.12. Опрос специальных свойств файла
У файла есть много свойств, которые можно опросить. Мы перечислим в этом разделе те встроенные методы, для которых не нашлось другого места. Почти все они являются предикатами.
Читая этот раздел (да и большую часть этой главы), помните о двух вещах. Во-первых, так как класс File
подмешивает модуль FileTest
, то любую проверку, для которой требуется вызывать метод, квалифицированный именем модуля, можно также выполнить, обратившись к методу экземпляра любого файлового объекта. Во-вторых, функциональность модуля FileTest
и объекта File::Stat
(возвращаемого методом stat
или lstat
) сильно перекрывается. В некоторых случаях есть целых три разных способа вызвать по сути один и тот же метод. Мы не будем каждый раз приводить все варианты.
В некоторых операционных системах устройства подразделяются на блочные и символьные. Файл может ссылаться как на то, так и на другое, но не на оба сразу. Методы blockdev?
и chardev?
из модуля FileTest
проверяют тип устройства:
flag1 = FileTest::chardev?("/dev/hdisk0") # false
flag2 = FileTest::blockdev?("/dev/hdisk0") # true
Иногда нужно знать, ассоциирован ли данный поток с терминалом. Метод tty?
класса IO
(синоним isatty
) дает ответ на этот вопрос:
flag1 = STDIN.tty? # true
flag2 = File.new("diskfile").isatty # false
Поток может быть связан с каналом (pipe) или сокетом. В модуле FileTest
есть методы для опроса этих условий:
flag1 = FileTest::pipe?(myfile)
flag2 = FileTest::socket?(myfile)
Напомним, что каталог — это разновидность файла. Поэтому нужно уметь отличать каталоги от обычных файлов, для чего предназначены два метода из модуля FileTest
:
file1 = File.new("/tmp")
file2 = File.new("/tmp/myfile")
test1 = file1.directory? # true
test2 = file1.file? # false
test3 = file2.directory? # false
test4 = file2.file? # true
В классе File
есть также метод класса ftype
, который сообщает вид потока; одноименный метод экземпляра находится в классе File::Stat
. Этот метод возвращает одну из следующих строк: file
, directory
, blockSpecial
, characterSpecial
, fifo
, link
или socket
(строка fifо
относится к каналу).
this_kind = File.ftype("/dev/hdisk0") # "blockSpecial"
that_kind = File.new("/tmp").stat.ftype # "directory"
В маске, описывающей режим файла, можно устанавливать или сбрасывать некоторые биты. Они не имеют прямого отношения к битам, обсуждавшимся в разделе 10.1.9. Речь идет о битах set-group-id, set-user-id и бите фиксации (sticky bit). Для каждого из них есть метод в модуле FileTest
.
file = File.new("somefile")
info = file.stat
sticky_flag = info.sticky?
setgid_flag = info.setgid?
setuid_flag = info.setuid?
К дисковому файлу могут вести символические или физические ссылки (в тех операционных системах, где такой механизм поддерживается). Чтобы проверить, является ли файл символической ссылкой на другой файл, обратитесь к методу symlink?
из модуля FileTest
. Для подсчета числа физических ссылок на файл служит метод nlink
(он есть только в классе File::Stat
). Физическая ссылка неотличима от обычного файла — это просто файл, для которого есть несколько имен и записей в каталоге.
File.symlink("yourfile","myfile") # Создать ссылку
is_sym = FileTest::symlink?("myfile") # true
hard_count = File.new("myfile").stat.nlink # 0
Отметим попутно, что в предыдущем примере мы воспользовались методом класса symlink
из класса File
для создания символической ссылки.
В редких случаях может понадобиться информация о файле еще более низкого уровня. В классе File::Stat
есть еще три метода экземпляра, предоставляющих такую информацию. Метод dev
возвращает целое число, идентифицирующее устройство, на котором расположен файл. Метод rdev
возвращает целое число, описывающее тип устройства, а для дисковых файлов метод ino
возвращает номер первого индексного узла, занятого файлом.
file = File.new("diskfile")
info = file.stat
device = info.dev
devtype = info.rdev
inode = info.ino
- 10.1.1. Открытие и закрытие файлов
- 10.1.2. Обновление файла
- 10.1.3. Дописывание в конец файла
- 10.1.4. Прямой доступ к файлу
- 10.1.5. Работа с двоичными файлами
- 10.1.6. Блокировка файлов
- 10.1.7. Простой ввод/вывод
- 10.1.8. Буферизованный и небуферизованный ввод/вывод
- 10.1.9. Манипулирование правами владения и разрешениями на доступ к файлу
- 10.1.10. Получение и установка временных штампов
- 10.1.11. Проверка существования и получение размера файла
- 10.1.12. Опрос специальных свойств файла
- 10.1.13. Каналы
- 10.1.14. Специальные операции ввода/вывода
- 10.1.15. Неблокирующий ввод/вывод
- 10.1.16. Применение метода readpartial
- 10.1.17. Манипулирование путевыми именами
- 10.1.18. Класс Pathname
- 10.1.19. Манипулирование файлами на уровне команд
- 10.1.20. Ввод символов с клавиатуры
- 10.1.21. Чтение всего файла в память
- 10.1.22. Построчное чтение из файла
- 10.1.23. Побайтное чтение из файла
- 10.1.24. Работа со строкой как с файлом
- 10.1.25. Чтение данных, встроенных в текст программы
- 10.1.26. Чтение исходного текста программы
- 10.1.27. Работа с временными файлами
- 10.1.28. Получение и изменение текущего каталога
- 10.1.29. Изменение текущего корня
- 10.1.30. Обход каталога
- 10.1.31. Получение содержимого каталога
- 10.1.32. Создание цепочки каталогов
- 10.1.33. Рекурсивное удаление каталога
- 10.1.34. Поиск файлов и каталогов
- 10.1.2. Обновление файла
- 10.1.3. Дописывание в конец файла
- 3.2.4. Ошибки при задавании вопросов
- 11.2. СВОЙСТВА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
- Эффективная работа с временными файлами сортировки
- Вопросы и ответы
- Единое имя файла параметров InterBase
- Параметры конфигурационного файла InterBase
- 13. Зарабатываем на своих файлах: файлообменники, загружаеми получаем процент за скачивание
- Листинг 15.11. Код для загрузки файла с Web-сервера
- Создание ярлыков в специальных папках
- 4. Свойства унарных операций