Atrybuty plik≤w

Strona g│≤wna

 

Atrybuty plik≤w

Pisalismy ju┐ o plikach tekstowych, pliach INI, a nie napisali╢my o jednej wa┐nej rzeczy: atrybuty plik≤w. Czyli jak je odczytywaµ, zapisywaµ i jak dodaµ do atrybut≤w pliku nowy atrybut, ┐eby nie zmieniµ innych. Na pocz▒tek dowiedzmy siΩ jakie mamy atrybuty:

Atrybut Sta│a w Delphi
Tylko do odczytu (Read Only) faReadOnly
Ukryty (Hidden) faHidden
Systemowy (System) faSysFile
Archiwalny (Archive) faArchive

Pierwsze kroki mamy za sob▒ (szczeg≤│, ┐e jeszcze nic nie wiemy ;). Przejd╝my dalej. Zapewne umiesz otwieraµ plik, zapisywaµ go itp i wiesz ile potrzeba wtedy zmiennych. »eby bawiµ siΩ w atrybutach pliku potrzebna tylko jedna zmienna: Integer, bo w│a╢nie w takiej postaci przechowywane s▒ atrybuty pliku. Dok│adniej: zapisane s▒ one w bitach, np.: je╢li bit zerowy ma warto╢µ 1, to plik jest tylko do odczytu, je╢li jeszcze jest zaznaczony bit pierwszy to plik jest jeszcze ukryty (itd). Kiedy tworzysz nowy plik to wszystkie bity przyjmuj▒ warto╢µ 0. W Delphi na szczΩ╢cie nie musimy bawiµ siΩ bezpo╢rednio w bitach. Dobra, dobra zr≤bmy co╢ wreszcie:

var
atrybuty: Integer;
begin
atrybuty := FileGetAttr('test.txt');

W powy┐szym przyk│adzie pobieramy, za pomoc▒ funkcji FileGetAttr, z pliku test.txt jego atrybuty i podstawiamy je pod zmienn▒ "atrybuty". No dobra tylko co nam z tego, ┐e mamy atrybuty w zmiennej skoro dalej ich nie znamy? Poni┐szy przyk│ad poka┐e to Wam, tylko do naszego formularza wstawcie najpierw cztery obiekty TCheckBox i:

var
atrybuty: Integer;
begin
atrybuty := FileGetAttr('test.txt');
if atrybuty and faReadOnly = faReadOnly then
CheckBox1.Checked := True
else CheckBox1.Checked := False;
if atrybuty and faHidden = faHidden then
CheckBox2.Checked := True
else CheckBox2.Checked := False;
if atrybuty and faSysFile = faSysFile then
CheckBox3.Checked := True
else CheckBox3.Checked := False;
if atrybuty and faArchive = faArchive then
CheckBox4.Checked := True
else CheckBox4.Checked := False;
end;

ªwietnie! Robimy postΩpy. Jak zauwa┐yli╢cie pierwszy obiekt TCheckBox jest od plik≤w Tylko do odczytu, drugi o plik≤w ukrytych, trzeci od plik≤w systemowych, a czwarty od archiwalnych. Zanim wyt│umaczΩ dok│adniej uruchomcie program i sprawd╝cie czy wszystko gra, a p≤╝niej chocia┐by Eksploratorem upewnijcie siΩ czy ustawienia s▒ takie same, je╢li tak to zmie±cie je i jeszcze raz uruchomcie program. Gra?

Teraz pora na dok│adniejsze t│umaczenie. Jak siΩ domy╢lacie chodzi mi o te linijki:

if atrybuty and faReadOnly = faReadOnly then // ... i tak dalej

Zmienna "atrybuty" mo┐e przyj▒µ wiΩcej ni┐ jeden atrybut pliku, wiΩc gdyby╢my dali:

if atrybuty = faReadOnly then

to obiekt TCheckBox by│by tylko zaznaczony wtedy, gdy nasz plik ma TYLKO zaznaczony atrybut faReadOnly. DziΩki wyrazowi "and" mo┐emy zaznaczyµ TCheckBox je╢li jeden z atrybut≤w r≤wny jest faReadOnly. Nie bΩdΩ wnika│ w szczeg≤│y, bo to wymaga zabawy z bitami, a przyznam szczerze, ┐e i ja nie rozumiem za bardzo tego przyk│adu na bitach. Od razu przechodzimy do zapisywania atrybut≤w. Robimy to za pomoc▒ procedury FileSetAttr. A wygl▒da to tak:

FileSetAttr('test.txt', faReadOnly);

Budowy chyba nie muszΩ t│umaczyµ, bo wszystko widaµ na przyk│adzie. Jak to bywa we wszystkich procedurach jest pewien haczyk, bo gdy bΩdziemy chcieli tylko dodaµ nowy atrybut to zaczn▒ siΩ schody, gdy┐ przy u┐yciu powy┐szego przyk│adu ustawimy atrybut faReadOnly na jeden, a resztΩ wyzerujemy. Jest jednak spos≤b. Mo┐emy najpierw pobraµ atrybuty z pliku, podstawiµ je pod zmienn▒, dodaµ nowy atrybut, a je╢li taki jest zaznaczony to nic nie robiµ i zapisaµ je wszystkie. DziΩki temu wszytsko siΩ uda, tylko jak to zrobiµ? Poni┐szy przyk│ad poka┐e Wam:

var
atrybuty: Integer;
begin
atrybuty := FileGetAttr('test.txt');
// pobieramy atrybuty
atrybuty := atrybuty or faReadOnly;
//dodajemy nowy atrybut
FileSetAttr('test.txt', atrybuty);

Dodajcie powy┐sz▒ procedurΩ do programu pod zdarzenie klikniΩcie przycisku "Dodaj atrybuty". Uruchomcie program. Najpierw odczytajcie atrybuty, za pomoc▒ pierwszej procedury, p≤╝niej kliknijcie na przycisk Dodaj atrybuty i znowu odczytajcie atrybuty. Powinno pojawiµ siΩ nowe zaznaczenie w pierwszym obiekcie TCheckBox (Tylko do odczytu). Je╢li tak, to dobrze wszystko dzia│a. Zapewne zauwa┐yli╢cie, ┐e przy dodawaniu atrybutu pos│u┐y│em siΩ operatorem or. To w│a╢nie czyni, ┐e do zmiennej jest dodawany nowy atrybut Tylko do odczytu, a je╢li taki istnieje to jest zostawiany w spokoju. Znowu musia│bym zasiΩgn▒µ do zabawy z bitami, ale m≤wiΩ Wam: Nie wart zawracaµ sobie tym g│owy. Oczywi╢cie mo┐ecie te┐ dodawaµ inne atrybuty, wiΩc zamiast faReadOnly podstawcie inny atrybut, kt≤rego znaczenie poda│em wy┐ej w tabelce.

PC