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




Описание - часть 2


    begin

      if depth <= 1 then

      begin

        (* Слишком углубились - закрываем этот каталог. *)

        seekpoint := telldir(Dp);

        closedir(Dp);

        Dp := nil;

      end;

      (* Обработка файла. *)

      strcopy(p, E^.name);

      i := ftw(fullpath, funcptr, depth - 1);

      if i<>0 then

      begin

        (* Пользователь завершил; оканчиваем работу. *)

        strdispose(fullpath);

        if Dp<>nil then

          closedir(Dp);

          ftw:=i;

          exit;

      end;

      (* Повторно отрываем каталог в случае необходимости. *)

      if Dp = nil then

      begin

        Dp := opendir(directory);

        if Dp = nil then

        begin

          (* WTF? *)

          strdispose(fullpath);

          ftw:=-1;

          exit;

        end;

        seekdir(Dp, seekpoint);

      end;

    end;

    E := readdir(Dp);

  end;

  (* Завершающие действия. *)

  strdispose(fullpath);

  closedir(Dp);

  ftw:=0;

end;

Первый параметр path определяет имя каталога, с которого должен начаться рекурсивный обход дерева. Параметр depth управляет числом используемых функцией ftw различных дескрипторов файлов. Чем больше значение depth, тем меньше будет случаев повторного открытия каталогов, что сократит общее время отработки вызова. Хотя на каждом уровне дерева будет использоваться только один дескриптор, следует быть уверенным, что значение переменной depth не больше числа свободных дескрипторов файлов. Для определения максимально возможного числа дескрипторов, которые может задействовать процесс, рекомендуется использовать системный вызов getrlimit, обсуждаемый в главе 12.

Второй параметр funcptr – это определенная пользователем функция, вызываемая для каждого файла или каталога, найденного в поддереве каталога path. Как можно увидеть из описания, параметр funcptr передается процедуре ftw как указатель на функцию, поэтому функция должна быть объявлена до вызова процедуры ftw. При каждом вызове функции funcptr будут передаваться три аргумента: заканчивающаяся нулевым символом строка с именем объекта, ссылка на структуру tstat с данными об объекте и целочисленный код. Функция funcptr, следовательно, должна быть построена следующим образом:




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