Óïðàâëåíèå ôàéëàìè
Óïðàæíåíèå 13.41. Ñîñòàâüòå àíàëîã êîìàíäû rm.
uses linux,sysutils;
var
f:text;
d:boolean;
k:char;
s:string;
begin
writeln('ââåäèòå èìÿ ôàéëà, êîòîðûé íóæíî óäàëèòü');
readln(s);
assign(f,s);
if s='' then
begin
writeln('ïîâòîðèòå ïîïûòêó');
exit;
end;
writeln('ïîäòâåðäèòå óäàëåíèå ôàéëà Y/N');
readln(k);
if (k='Y') or (k='y') then
begin
d:=deletefile(s);
if d then
writeln('ôàéë óäàëåí')
else
writeln('ôàéë íå óäàëåí');
end
else
writeln('ôàéë íå óäàëåí');
end.
Óïðàæíåíèå 13.42. Èñïîëüçóÿ ñèñòåìíûé âûçîâ fstat, íàïèøèòå ïðîãðàììó, îïðåäåëÿþùóþ òèï ôàéëà: îáû÷íûé ôàéë, êàòàëîã, óñòðîéñòâî, FIFO-ôàéë.
uses linux,strings,sysutils;
function gettype(mode:integer):string;
begin
if S_ISREG(mode) then
gettype:='ôàéë'
else
if S_ISDIR(mode) then
gettype:='êàòàëîã'
else
if S_ISCHR(mode) then
gettype:='áàéòîîðèåíòèðîâàííîå óñòðîéñòâî'
else
if S_ISBLK(mode) then
gettype:='áëî÷íîîðèåíòèðîâàííîå óñòðîéñòâî'
else
if S_ISFIFO(mode) then
gettype:='FIFO-ôàéë'
else
gettype:='äðóãîå';
end;
var
st:stat;
name:array[0..255] of char;
begin
if paramcount = 0 then
name:='.'
else
name:=fexpand(paramstr(1));
if not fstat(pchar(name),st) then
writeln('Îøèáêà âûçîâà stat äëÿ ',name)
else
write(gettype(st.mode));
end.
Óïðàæíåíèå 13.43. Ñîñòàâüòå àíàëîã êîìàíäû chgrp.
Uses linux;
Var
UID,GID:Longint;
F:Text;
Code:Integer;
begin
Writeln('This will only work if you are root.');
if ParamCount<3 then
begin
Writeln('Error!!!');
Writeln('Format: ./task <Filename> <UID> <GID>');
Halt(1);
end;
val(Paramstr(2),UID,Code);
if Code<>0 then
begin
Writeln('Error!!!');
Writeln('Format: ./task <Filename> <UID> <GID>');
ààààà Halt(1);
ààà end;
à val(Paramstr(3),GID,Code);
à if Code<>0 then
ààà begin
ààààà Writeln('Error!!!');
ààààà Writeln('Format: ./task <Filename> <UID> <GID>');
ààààà Halt(1);
ààà end;
à if not Chown(ParamStr(1),UID,GID)à then
à if LinuxError=Sys_EPERM then
àààà Writeln('You are not root!')
à else
àààà Writeln(' Chmod failed with exit code: ',LinuxError)
à else
àààà Writeln('Changed owner successfully!');
end.
Lÿ¨ðöýõýøõ 13.44. Tþ¸ªðò¹ªõ ðýðûþó úþüðýôv mkdir.
Program Tabs;
begin
{$I-}
if ParamCount=1 then
à begin
ààà MkDir(ParamStr(1));
ààà if IOResult <> 0 then Writeln('Cannot create directory')
ààà else Writeln('New directory created');
à end
else Writeln('Error');
end.
Lÿ¨ðöýõýøõ 13.45. Tþ¸ªðò¹ªõ ðýðûþó úþüðýôv chmod.
uses linux;
var
à f,ch:string;
à n,i:byte;
à d:integer;
begin
à if paramcount<>2 then
à begin
ààà writeln('L¸ÿþû¹÷ºùªõ: ',paramstr(0),' ÿ¨ðòð_ôþ¸ªºÿð ¯ðùû/úðªðûþó');
ààà exit;
à end;
à f:=paramstr(2);
à ch:=paramstr(1);
à n:=length(ch);
à d:=0;
à for i:=1 to n do
ààà if not (ch[i] in ['0'..'7']) then
ààà begin
ààààà writeln('¦¨ðòð ôþ¸ªºÿð ôþûöýv ñvª¹ ò òþ¸¹üõ¨ø¢ýþü ¯þ¨üðªõ');
ààààà exit;
ààà end
ààà else
ààààà d:=d*8+byte(ch[i])-byte('0');
à if not chmod(f,d) then
ààà writeln('+°øñú𠺸ªðýþòúø ÿ¨ðò ôþ¸ªºÿð ',ch,' ôû ',f);
end.
Lÿ¨ðöýõýøõ 13.46. Tþ¸ªðò¹ªõ ðýðûþó úþüðýôv chown.
uses linux,strings,sysutils,crt;
type
à plong=^longint;
procedure perror(s:pchar);cdecl;external 'c';
function strchr(s:string;c:char):boolean;
var
à i:integer;
begin
à for i:=1 to length(s) do
ààà if s[i]=c then
ààà begin
ààààà strchr:=true;
ààààà exit;
ààà end;
à strchr:=false;
end;
procedure getall(w:string;name:string;var uid,gid:integer);
var ts,nam1,namb1,namb2:string;
ààà tx:text;
ààà d:integer;
ààà f:boolean;
begin
à assign(tx,w);
à reset(tx);
à f:=false;
à while not EOF (tx) and not f do
à begin
àààààà readln(tx,ts);
àààààà d:=pos(':',ts);
àààààà nam1:=copy(ts,1,d-1);
àààààà delete(ts,1,d+2);
àààààà d:=pos(':',ts);
àààààà namb1:=copy(ts,1,d-1);
àààààà delete(ts,1,d);
àààààà val(namb1,d);
àààààà uid:=d;
àààààà d:=pos(':',ts);
àààààà namb2:=copy(ts,1,d-1);
àààààà val(namb2,d);
àààààà gid:=d;
àààààà if nam1=name then
àààààààà f:=true;
à end;
à if not f then
à begin
ààà uid:=-1;
ààà gid:=-1;
à end;
à close(tx);ààààà
end;
var
à username,groupname,fname:string;
à uid,gid:integer;à
à posit,temp:integer;
begin
à if paramcount<>2 then
à begin
ààà writeln('L¸ÿþû¹÷ºùªõ: ',paramstr(0),' òûðôõûõ¡[:ó¨ºÿÿð] ¯ðùû');
ààà exit;àà
à end;
à username:=paramstr(1);
à fname:=paramstr(2);
à posit:=0;
à posit:=pos(':',username);
à if posit<>0 then
à begin
ààà groupname:=copy(username,posit+1,length(username)-posit);
ààà username[0]:=char(posit-1);
ààà getall('/etc/passwd',username,uid,gid);
ààà getall('/etc/group',groupname,gid,temp);
à end
à else
ààà getall('/etc/passwd',username,uid,gid);
à if (uid=-1) or (gid=-1) then
à begin
ààà writeln('=õòõ¨ýþõ øü òûðôõû¹¡ð (ó¨ºÿÿv)');
ààà exit;
à end;
à if not chown(fname,uid,gid) then
ààà perror('+°øñúð òv÷þòð chown');
end.
Lÿ¨ðöýõýøõ 13.47. Tþ÷ôðùªõ ÿ¨þó¨ðüüº chmodr, ¨õúº¨¸øòýþ ø÷üõý ¦•º¦ ÿ¨ðòð ôþ¸ªºÿð ôû ò¸õ¿ ¯ðùûþò úðªðûþóð ø òûþöõýýv¿ ò ýõóþ ÿþôúðªðûþóþò. Lü úðªðûþóð ø ÿ¨ðòð ºúð÷vò𦪸 ò úþüðýôýþù ¸ª¨þúõ.
uses linux,strings,sysutils,crt;
function gettype(mode:integer):char;
begin
à if S_ISREG(mode) then
ààà gettype:='-'
à else
ààà if S_ISDIR(mode) then
ààààà gettype:='d'
ààà else
ààààà if S_ISCHR(mode) then
ààààààà gettype:='c'
ààààà else
ààààààà if S_ISBLK(mode) then
ààààààààà gettype:='b'
ààààààà else
ààààààààà if S_ISFIFO(mode) then
ààààààààààà gettype:='p'
ààààààààà else
ààààààààààà gettype:='l';
end;
function obhod(prava:integer;name:pchar):boolean;
var
à flag:boolean;
à d:PDIR;
à el:pdirent;
à st:stat;
à res:integer;
à polniypath:array [0..2000] of char;
à ch:string;
à n,i:byte;
begin
à flag:=true;
à d:=opendir(name);
à if d=nil then
à begin
ààà writeln('+°øñúð þªú¨vªø úðªðûþóð ',name);
ààà exit;
à end;
à el:=readdir(d);
à while el<>nil do
à begin
ààà polniypath:=name;
ààà if strcomp(name,'/')=0 then
ààààà strcat(polniypath,el^.name)
ààà else
ààà begin
ààààà if name[strlen(name)-1]<>'/' then
ààààààààà strcat(polniypath,'/');
ààààà strcat(polniypath,el^.name);
ààà end;
ààà
ààà if not fstat(pchar(polniypath),st) then
ààààààà writeln('+°øñúð òv÷þòð stat ôû ',polniypath)
ààà else
ààà begin
àààààààààà //if not (gettype(st.mode) = 'd') then
àààà àif not chmod(pchar(polniypath),prava) then
ààààààà writeln('+°øñú𠺸ªðýþòúø ÿ¨ðò ôþ¸ªºÿð ',prava,' ôû ',polniypath);
ààà end;
ààà el:=readdir(d);
à end;
à closedir(d);
à
à d:=opendir(name);
à el:=readdir(d);
à while el<>nil do
à begin
ààà polniypath:=name;
ààà if strcomp(name,'/')=0 then
ààààà strcat(polniypath,el^.name)
ààà else
ààà begin
ààààà if name[strlen(name)-1]<>'/' then
ààààààà strcat(polniypath,'/');
ààààà strcat(polniypath,el^.name);
ààà end;
ààà if not fstat(pchar(polniypath),st) then
àààà àwriteln('+°øñúð òv÷þòð stat ôû ',polniypath)
ààà else
ààà begin
ààààà if (gettype(st.mode)='d') and
àààààààà (strcomp(el^.name,'.')<>0) and
àààààààà (strcomp(el^.name,'..')<>0) then
ààààà begin
ààààààà writeln('¦õ¨õ¿þô ò úðªðûþó ',polniypath);ààààà
àà àààààif not obhod(prava,polniypath) then
ààààààààà flag:=false;
ààààà end;
ààà end;
ààà el:=readdir(d);
à end;
à closedir(d);
à if not flag then
ààà writeln(' L úðªðûþóð ',name, ' ýõ ºôðûþ¸¹ ø÷üõýøª¹ ÿ¨ðòð ôþ¸ªºÿð ');
//à writeln('-û úðªðûþóð ',name, ' ÿþûº¢õý ',flag);
à obhod:=flag;
end;
var
à name:array [0..2000] of char;
à prava,i:integer;
à ch:string;
begin
à if paramcount<>2 then
à begin
ààà writeln('L¸ÿþû¹÷ºùªõ: ',paramstr(0),' ÿ¨ðòð_ôþ¸ªºÿð ¯ðùû/úðªðûþó');
ààà exit;
à end;
à name:=paramstr(2);
ààch:=paramstr(1);
à prava:=0;
à for i:=1 to length(ch) do
ààà if not (ch[i] in ['0'..'7']) then
ààà begin
ààààà writeln('¦¨ðòð ôþ¸ªºÿð ôþûöýv ñvª¹ ò òþ¸¹üõ¨ø¢ýþü ¯þ¨üðªõ');
ààààà exit;
ààà end
ààà else
ààààà prava:=prava*8+byte(ch[i])-byte('0');
à
à obhod(prava,name);
end.
Lÿ¨ðöýõýøõ 13.48. =ðÿø°øªõ ÿ¨þó¨ðüüº, ¸þòüõ•ð¦•ð úþüðýôv mv ø cp (ò ÷ðòø¸øüþ¸ªø þª ¸òþõóþ ýð÷òðýø ).
uses linux,sysutils;
var
à b:byte;
à s:string;
à f1,f2:file of byte;
begin
à s:=paramstr(0);
à delete(s,1,length(s)-2);
à if s='mv' then
à begin
ààà if paramcount<2 then
ààà begin
ààààà writeln('Error: wrong arguments');
ààààà writeln('òòõôøªõ øü ¯ðùûð, úþªþ¨vù ¿þªøªõ ÿõ¨õøüõýþò𪹠ø ýþòþõ øü ¯ðùûð');
ààààà halt(1);
ààà end;
ààà Assign(F1,paramstr(1));
ààà Assign(F2,paramstr(2));
ààà if not frename(paramstr(1),paramstr(2)) then
ààà begin
ààààà writeln('ýõòþ÷üþöýþ ÿõ¨õøüõýþò𪹠');
ààààà halt(1);
ààà end;
à end
à else
ààà if s='cp' then
ààà begin
ààààà if paramcount<2 then
ààààà begin
ààààààà writeln('Error: wrong arguments');
ààààààà writeln('format: cp <fileinp> <fileout>');
ààààààà Halt(1);
ààààà end;
ààààà Assign(f1,paramstr(1));
ààààà Reset(f1);
ààààà Assign(f2,paramstr(2));
ààààà Rewrite(f2);
ààààà while not eof(f1)do
ààààà begin
ààààààà read(f1,b);
ààààààà write(f2,b);
ààààà end;
ààààà close(f1);
ààààà close(f2);
ààà end
ààà else
ààààà writeln('¦õ¨õøüõýºùªõ ÿ¨þó¨ðüüº ò mv / cp');
end.
Lÿ¨ðöýõýøõ 13.49. Tþ¸ªðò¹ªõ ðýðûþó úþüðýôv sync.
procedure sync;cdecl; external 'c';
begin
à sync;
end.
Lÿ¨ðöýõýøõ 13.50. Tþ÷ôðùªõ ÿ¨þó¨ðüüº, òvòþô •º¦ ¸þôõ¨öøüþõ ¸øüòþûø¢õ¸úþù ¸¸vûúø, ð ÷ðªõü Ö ¡õûõòþóþ ¯ðùûð, ýð úþªþ¨vù þýð ºúð÷vòðõª.
uses linux;
var
à name,temp:array [0..1023] of char;
à kol,fd:integer;
begin
à if paramcount<>1 then
à begin
ààà writeln('L¸ÿþû¹÷ºùªõ: ',paramstr(0),' øü _¸¸vûúø');
ààà exit;
à end;
à temp:=paramstr(1);
à kol:=readlink(temp,name,1023);
à if kol=-1 then
à begin
ààà writeln('+°øñú𠢪õýø ¸¸vûúø ',temp);
ààà exit;
à end;
à name[kol]:=#0;
à writeln('¦þ ¸¸vûúõ ',paramstr(1), ' ýðùôõý ¯ðùû ',name);
à fd:=fdopen(name,Open_RDONLY);
à if fd=-1 then
à begin
ààà writeln('+°øñúð þªú¨vªø ',name);
ààà exit;
à end;
à kol:=fdread(fd,name,1024);
à while kol>0 do
à begin
ààà fdwrite(1,name,kol);
ààà kol:=fdread(fd,name,1024);
à end;
à fdclose(fd);
end.