Системное программирование в UNIX средствами Free Pascal


         

Целочисленный аргумент _type может принимать


function func (name:pchar; var status:tstat; _type:integer):integer;
begin
  (* Тело функции *)
end;
Целочисленный аргумент _type может принимать одно из нескольких возможных значений, описывающих тип встретившегося объекта. Вот эти значения:






















FTW_F

Объект является файлом

FTW_D

Объект является каталогом

FTW_DNR

Объект является каталогом, который нельзя прочесть

FTW_SL

Объект является символьной ссылкой

FTW_NS

Объект не является символьной ссылкой, и для него нельзя успешно выполнить вызов fstat

Если объект является каталогом, который нельзя прочесть (_type = FTW_DNR), то его потомки не будут обрабатываться. Если нельзя успешно выполнить функцию fstat (_type = FTW_NS), то передаваемая для объекта структура tstat будет иметь неопределенные значения.
Работа вызова будет продолжаться до тех пор, пока не будет завершен обход дерева или не возникнет ошибка внутри функции ftw. Обход также закончится, если определенная пользователем функция возвратит ненулевое значение. Тогда функция ftw прекратит работу и вернет значение, возвращенное функций пользователя. Ошибки внутри функции ftw приведут к возврату значения -1, тогда в переменной linuxerror будет выставлен соответствующий код ошибки.
Следующий пример использует функцию ftw для обхода поддерева каталогов, выводящего имена всех встретившихся файлов (каталогов) и права доступа к ним. Каталоги и символьные ссылки при выводе будут обозначаться дополнительной звездочкой.
Сначала рассмотрим функцию list, которая будет передаваться в качестве аргумента функции ftw.
function list(name:pchar; var status:tstat; _type:integer):integer;
begin
  (* Если вызов stat завершился неудачей, просто вернуться *)
  if (_type = FTW_NS) then
  begin
    list:=0;
    exit;
  end;
  (*
   * Иначе, вывести имя объекта,
   * права доступа к нему и постфикс "*",
   * если объект является каталогом или символьной ссылкой.
   *)
  if (_type = FTW_F) then
    printf ('%-30s'#9'0%3o'#$a, [name, status.mode and octal(0777)])

Содержание  Назад  Вперед