Функции 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