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