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

       

Функции readdir должен передаваться допустимый


uses linux;
Function ReadDir(dirptr:pdir):pdirent;
Функции readdir должен передаваться допустимый указатель на дескриптор открытого каталога, обычно возвращаемый предшествующим вызовом opendir. При первом вызове readdir в структуру dirent будет считана первая запись в каталоге. В результате успешного вызова указатель каталога переместится на следующую запись.
Когда в результате последующих вызовов readdir достигнет конца каталога, то вызов вернет нулевой указатель. Если в какой-то момент потребуется начать чтение каталога с начала, то можно использовать системный вызов rewinddir, определенный следующим образом:


uses stdio;
procedure rewinddir(dirptr:pdir);
Следующий после вызова rewinddir вызов readdir вернет первую запись в каталоге, на который указывает переменная dirptr.
В приведенном ниже примере функция my_double_ls дважды выведет на экран имена всех файлов в заданном каталоге. Она принимает в качестве параметра имя каталога и в случае ошибки возвращает значение -1.
uses linux,stdio;
function my_double_ls(name:pchar):integer;
var
  dp:PDIR;


  d:pdirent;
begin
  (* Открытие каталога с проверкой ошибок *)
  dp:=opendir (name);
  if dp=nil then
  begin
    my_double_ls:=-1;
    exit;
  end;
  (* Продолжить обход каталога,
   * выводя записи в нем, если
   * индекс остается допустимым
   *)
  d:=readdir(dp);
  while d<>nil do
  begin
    if d^.ino<>0 then
      writeln(d^.name);
    d:=readdir(dp);
  end;
  (* Вернуться к началу каталога ... *)
  rewinddir(dp);
  (* ... и снова вывести его содержимое *)
  d:=readdir(dp);
  while d<>nil do
  begin
    if d^.ino<>0 then
      writeln(d^.name);
    d:=readdir(dp);
  end;
  closedir(dp);
  my_double_ls:=0;
end;
Порядок выводимых функцией my_double_ls имен файлов будет совпадать с порядком расположения файлов в каталоге. Если вызвать функцию my_double_ls в каталоге, содержащем три файла abc, bookmark и fred, то ее вывод может выглядеть так:
.
..
fred
bookmark
abc
.
..
fred
bookmark
abc

Содержание раздела