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

Данный текст является ознакомительным фрагментом.



Поделитесь на страничке

Похожие главы из других книг:

Установка размера файла, инициализация файла и разреженные файлы

Из книги автора

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


Опрос состояния службы

Из книги автора

Опрос состояния службы Для получения структурой SERVICE_STATUS текущего состояния службы используется следующая функция:  BOOL QueryServiceStatus(SC_HANDLE hService, LPSERVICE_STATUS


Опрос и установка часов реального времени, и кое-что еще

Из книги автора

Опрос и установка часов реального времени, и кое-что еще Независимо от применения таймеров, вы можете также опрашивать и устанавливать часы реального времени, а также и плавно подстраивать их. Для этих целей можно использовать следующие


Приложение 2 МЕЖДУНАРОДНЫЙ ОПРОС 2003 ГОДА ПО ИНФОРМАЦИОННОЙ БЕЗОПАСНОСТИ. ОБЗОР РЕЗУЛЬТАТОВ ПО СТРАНАМ СНГ

Из книги автора

Приложение 2 МЕЖДУНАРОДНЫЙ ОПРОС 2003 ГОДА ПО ИНФОРМАЦИОННОЙ БЕЗОПАСНОСТИ. ОБЗОР РЕЗУЛЬТАТОВ ПО СТРАНАМ СНГ В начале 2004 года компания «Эрнст энд Янг» опубликовала результаты своего исследования состояния информационной безопасности в СНГ ( www.eu.com/russia ). В этом исследовании


14.9. Расширенный опрос

Из книги автора

14.9. Расширенный опрос В начале этой главы мы рассказывали о способах установки таймеров для операций с сокетами. Во многих операционных системах для этого существуют функции poll и select, которые были описаны в главе 6. Ни один из этих методов еще не стандартизован POSIX, поэтому


10.3.4 Опрос терминала

Из книги автора

10.3.4 Опрос терминала Иногда удобно производить опрос устройства, то есть считывать с него данные, если они есть, или продолжать выполнять обычную работу — в противном случае. Программа на Рисунке 10.18 иллюстрирует этот случай: после открытия терминала с параметром "no delay"


5.7.8 Удаление специальных символов

Из книги автора

5.7.8 Удаление специальных символов После того, как все подстановки в командной строке сделаны, из нее еще удаляются все вхождения символов , ` и ", которые служили для отмены специального значения других


2.32. Печать специальных символов

Из книги автора

2.32. Печать специальных символов Метод dump позволяет получить графическое представление символов, которые обычно не печатаются вовсе или вызывают побочные эффекты:s1 = "Внимание" << 7 << 7 << 7 # Добавлено три символа ASCII BEL.puts s1.dump                   # Печатается:


3.3. Экранирование специальных символов

Из книги автора

3.3. Экранирование специальных символов Метод класса Regexp.escape экранирует все специальные символы, встречающиеся в регулярном выражении. К их числу относятся звездочка, вопросительный знак и квадратные скобки.str1 = "[*?]"str2 = Regexp.escape(str1) # "[*?]"Синонимом является метод


11.1.6. Опрос класса объекта

Из книги автора

11.1.6. Опрос класса объекта Часто возникает вопрос: «Что это за объект? Как он соотносится с данным классом?» Есть много способов получить тот или иной ответ.Во-первых, метод экземпляра class всегда возвращает класс объекта. Применявшийся ранее синоним type объявлен устаревшим.s


13.1.3. Опрос и изменение состояния потока

Из книги автора

13.1.3. Опрос и изменение состояния потока В классе Thread есть несколько полезных методов класса. Метод list возвращает массив «живых» потоков, метод main возвращает ссылку на главный поток программы, который породил все остальные, а метод current позволяет потоку идентифицировать


Названия специальных файлов

Из книги автора

Названия специальных файлов В Windows существует ряд специальных папок, в которых содержатся файлы определенной категории. Например, в папке Избранное содержатся ссылки на любимые сайты пользователя.Проблема заключается в том, что в локализованных версиях Windows эти папки


Замена специальных символов

Из книги автора

Замена специальных символов Как мы уже знаем, в XML есть несколько специальных символов, которые, как правило, заменяются процессором при выводе документа на соответствующие символьные или встроенные сущности. К примеру, для того, чтобы вывод был корректным XML-документом,


Ввод специальных символов

Из книги автора

Ввод специальных символов Если возникнет необходимость ввести символы, которых нет на клавиатуре, например знаки градуса, диаметра, символы греческого алфавита и т. п., то можно сделать это, используя кнопку Insert Symbol (Вставить символ) – третью по счету кнопку в левом