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

Файловые системы


Упражнение 13.34. Создайте аналог команды df.

uses linux;

var  s:string;

     p:statfs;

     i,k: word;

     fd:text;

     buf:array[1..1000]of char;

     pol:boolean;

var

     size:array[1..3] of double;

     sizepow:array[1..3] of integer;

const

  letters:array [0..3] of char=('b','K','M','G');



    

function point_Mount(var f:string):string;

var str:string;j,k:integer;flag:boolean;

begin

str:='';

k:=0;

flag:=false;

 for j:=1 to length(f) do

    begin

        if f[j]=' ' then begin flag:=true;inc(k);end;

        if (flag=true)and(k=1)then

       begin

         str:=str+f[j];

       end;

    end;

delete(str,1,1);   

point_Mount:=str;   

end;

begin

assign(fd,'/etc/mtab');

reset(fd);

pol:=true;

Writeln('Файловая система     Размер     Испол       Дост    Исп%   Подключено к');

while  not eof(fd) do

 begin

  readln(fd,s);

  

  pol:=fsstat(point_Mount(s),p);

 if (pol)and(p.blocks<>0) then

    begin

     for i:=1 to length(s) do

   begin

    write(s[i]);

    if s[i]=' ' then break;

   end;

  

   for k:=i to 1 do

     write(' ');

  

    size[1]:=1.*p.blocks*p.bsize;

    size[2]:=1.*(p.blocks-p.bavail)*p.bsize;

    size[3]:=1.*p.bavail*p.bsize;

   

    for i:=1 to 3 do

    begin

      sizepow[i]:=0;

      while size[i]>1024 do

      begin

        size[i]:=size[i]/1024;

        inc(sizepow[i]);

      end;

    end;

   

    writeln(size[1]:15:1,letters[sizepow[1]],{Истинный  размер }

   

   

    size[2]:10:1,letters[sizepow[2]],         {Используемый размер}

   

   

    size[3]:10:1,letters[sizepow[3]],         {Доступно или свободно}

   

   

    '   ',((p.blocks-p.bavail)*100/p.blocks):4:0,'%   ',    {Процентное соотношение используемого места}

    ' ',point_Mount(s));                           {Подключение}   

    end

 end;

 

close(fd);

end.



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