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


         

Первый параметр path определяет имя


    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, следовательно, должна быть построена следующим образом:

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





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий