Polish (Poland)English (United Kingdom)

Tcl: wirtualne systemy plik贸w - podstawy
Tcl/Tk - Language
Friday, 27 May 2011 20:47

Wirtualne systemy plik贸w (VFS) s膮 wci膮偶 s艂abo spopularyzowanym zagadnieniem w艣r贸d szerokiej rzeszy u偶ytkownik贸w, i - je艣li w og贸le - kojarz膮 si臋 przede wszystkim ze sposobem, w jaki systemy rodziny Unix/Linux u偶ywaj膮 przy dost臋pie do danych plikowych, a wi臋c tematem zaawansowanym i le偶膮cym poza zainteresowaniami przeci臋tnego tw贸rcy oprogramowania. Je艣li nie jeste艣 zatem programist膮 kernela, mo偶esz niniejszy temat 艣mia艂o odpu艣ci膰. Czy rzeczywi艣cie?

(poni偶szy tekst ukaza艂 si臋 w Software Developers Journal)

Definicj臋 czym jest wirtualny system plik贸w mo偶emy sprowadzi膰 do prostego sformu艂owania: dany zas贸b 鈥瀠daje鈥 zwyk艂y, lokalny system plik贸w tak, 偶e mo偶emy korzysta膰 z niego w spos贸b prze藕roczysty, u偶ywaj膮c tych samych metod i polece艅 co w przypadku prawdziwego systemu plik贸w.

Ka偶dy z tych zasob贸w ma w艂asn膮, wewn臋trzn膮 metod臋 przechowywania i zarz膮dzania plikami, za艣 system VFS jest warstw膮 abstrakcji oferuj膮c膮 ujednolicony interfejs dost臋powy. Jakkolwiek temat mo偶e wydawa膰 si臋 odleg艂y, okazuje si臋 偶e cz臋sto korzystamy z tego typu rozwi膮za艅 na codzie艅:

  • dost臋p do archiw贸w typu zip czy rar oferowany przez TotalCommander

  • TrueCrypt i jego wirtualne woluminy

Artyku艂 ten jest pierwszym z cyklu po艣wi臋conego tworzeniom zaawansowanych rozwi膮za艅 w oparciu o VFSy i j臋zyk Tcl. W tym odcinku zyskamy solidne podstawy na temat architektury Tcla w kontek艣cie wirtualnych system贸w plik贸w, oraz poznamy kilka gotowych implementacji i ich zastosowania.

Wszystkie przyk艂ady w niniejszym artykule by艂y uruchamiane z u偶yciem dystrybucji ActiveTcl w wersji 8.5.x.

System plik贸w w 艣rodowisku Tcl

Od pocz膮tku istnienia j臋zyk Tcl/Tk posiada funkcje pozwalaj膮ce na dost臋p do plik贸w 鈥 takie jak polecenie open, file czy glob. Od wersji 7.x interpreter Tcla posiada w艂asne API dost臋pu do systemu plik贸w z poziomu j臋zyka C, przykrywaj膮ce funkcje systemowe, co pozwoli艂o na stworzenie warstwy abstrakcji.聽


Tcl C API

Chocia偶 Tcl jest j臋zykiem skryptowym, jego interpreter jest napisany w j臋zyku C. Budowa Tcla pozwala na tworzenie dodatkowych modu艂贸w oferuj膮cych now膮 funkcjonalno艣膰. Modu艂y te mog膮 by膰 pisane w Tclu lub w j臋zyku C. W tym drugim przypadku, komunikacja z interpreterem przebiega za pomoc膮 wywo艂a艅 odpowiednich funkcji z Tcl C API.

聽W roku 1999, r贸wnocze艣nie z opublikowaniem wersji Tcl 8.0 powsta艂 komercyjny pakiet TclPro, a wraz nim narz臋dzie prowrap pozwalaj膮ce na 鈥瀙akowanie鈥 program贸w napisanych za pomoc膮 skrypt贸w Tclowych do pojedynczych plik贸w wykonywalnych. Rozwi膮zanie to sta艂o si臋 bardzo popularne i ka偶da nast臋pna wersja j臋zyka Tcl oferowa艂a coraz lepsze wsparcie do dostarczania aplikacji w tej postaci. Wraz z wersj膮 Tcl 8.1 powsta艂o r贸wnie偶 pierwsze darmowe rozwi膮zanie do dostarczania aplikacji w Tcl/Tk jako samodzielny plik wykonywalny 鈥 freeWRAP.

Od wersji 8.4 cz臋艣膰 Tcl C API odpowiedzialna za dost臋p do plik贸w zosta艂a zmieniona. Jedn膮 z wa偶niejszych zmian jest mo偶liwo艣膰 rejestrowania wielu 鈥瀌ostawc贸w鈥 (providers) system贸w plik贸w 鈥 standardowym jest system plik贸w oferowany przez system operacyjny, okre艣lany cz臋sto mianem natywnego. Dzi臋ki temu powsta艂o kilka innych rozwi膮za艅 鈥 m.in. Tclkit, kt贸ry stworzy艂 r贸wnie偶 system plik贸w dedykowany dla j臋zyka Tcl/Tk oraz jego nieformalny nast臋pca Cookit, kt贸ry dzi臋ki zmianach w sposobie kompresji pozwala na generowanie znacznie mniejszych plik贸w wynikowych.

Tclkit oraz Cookit s膮 rozwi膮zaniami pozwalaj膮cymi na budowanie samodzielnych aplikacji w oparciu o j臋zyk Tcl. Interpreter Tcla wraz ze skryptami tworz膮cymi dan膮 aplikacj臋 s膮 spakowane do pojedynczego wykonywalnego pliku, kt贸ry do uruchomienia nie wymaga 偶adnych zewn臋trznych dodatk贸w. Rozwi膮zania te opiszemy bli偶ej w nast臋pnych artyku艂ach tej serii.>

聽Dzi臋ki temu, i偶 od ponad 10 lat j臋zyk Tcl oferuje API do operacji na plikach, wiele rozszerze艅 napisanych w czystym C nie ma k艂opot贸w (tak d艂ugo jak u偶ywaj膮 funkcji plikowych z Tcl C API zamiast z j臋zyka C) z poprawnym dost臋pem do zasob贸w zar贸wno w natywnym, jak i w wirtualny systemie plik贸w. Przyk艂adem jest pakiet graficzny Tk, kt贸ry pozwala przyk艂adowo na odczyt obrazk贸w wprost z archiwum lub pakiet Snack, oferuj膮cy mo偶liwo艣膰 odtwarzania muzyki wprost z wirtualnego systemu plik贸w.

Ponadto sam Tcl obs艂uguje poprawnie 艂adowanie binarnych rozszerze艅 (.dll lub .so) z wirtualnych system贸w plik贸w. Na systemach operacyjnych, kt贸re na to pozwalaj膮, dana biblioteka 艂adowana jest do pami臋ci i inicjalizowana. W innych przypadkach kopiowana jest do tymczasowego pliku, a po zako艅czeniu pracy automatycznie usuwana.

Wolumeny oraz dostawcy system贸w plik贸w

Tcl zak艂ada istnienie wielu wolumen贸w, czyli 艣cie偶ek pod jakimi dany system plik贸w jest dost臋pny 鈥 na przyk艂ad s膮 to C:\, D:\ i wszystkie inne dyski na systemach Windows oraz / dla system贸w typu Unix. W tym drugim przypadku nie ma rozr贸偶nienia pomi臋dzy urz膮dzeniami fizycznymi zarejestrowanymi w systemie 鈥 np. nawet je艣li w katalogu /media/usbstick dost臋pny jest pendrive, Tcl nie traktuje go osobny wolumen.

Ka偶dy dodatkowy system plik贸w mo偶e zarejestrowa膰 si臋 jako punkt montowania w istniej膮cym ju偶 wolumenie 鈥 np /tmp/myvfs lub jako nowy wolumen jak na przyk艂ad http:// czy ftp://.

Czysty j臋zyk Tcl pozwala na tworzenie w艂asnych system贸w plik贸w jedynie z poziomu C. W tym celu nale偶y zaimplementowa膰 odpowiednie funkcje 鈥 takie jak pobieranie zawarto艣ci katalogu, informacji o poszczeg贸lnych plikach i katalogach oraz funkcje zwi膮zane z otwieraniem plik贸w do odczytu lub zapisu - oraz zarejestrowa膰 nowy system plik贸w w 艣rodowisku Tcl.

Tworzenie system贸w plik贸w na poziomie skrypt贸w Tcl

Nie ka偶dy u偶ytkownik Tcla jest jednocze艣nie znawc膮 j臋zyka C. Aby r贸wnie偶 i to grono programist贸w mog艂o w pe艂ni korzysta膰 z urok贸w VFS贸w, powsta艂 pakiet tclvfs, kt贸ry umo偶liwia implementacj臋 w oparciu o czyste skrypty Tcl, bez potrzeby kodowania natywnego i kompilacji. Analogicznie, r贸wnie偶 w tym przypadku wymagane jest zaimplementowanie pewnego zestawu funkcji (polece艅 Tcla) zwi膮zanych z pobieraniem informacji o katalogach i plikach. Polecenia te s膮 odpowiednikami niskopoziomowych funkcji j臋zyka C takich jak access czy stat.

Pakiet tclvfs zawiera r贸wnie偶 kilka 鈥瀏otowych鈥 dostawc贸w system贸w plik贸w 鈥 m.in. obs艂ug臋 archiw贸w zip, tar, czy dost臋p do plik贸w poprzez http lub ftp. S膮 one nie tylko gotowymi do u偶ycia implementacjami, ale r贸wnie偶 鈥 dzi臋ki dost臋powi do kodu 藕r贸d艂owego - znakomitym 藕r贸d艂em wiedzy. Tclvfs dostarczany jest z najpopularniejsz膮 dystrybucj膮 j臋zyka Tcl 鈥 ActiveTcl firmy ActiveState.


Rysunek 1. Architektura obs艂ugi VFS w j臋zyku Tcl

Systemy plik贸w a odczyt i zapis

Same systemy plik贸w 鈥 zar贸wno te napisane w Tcl jak i w C 鈥 oferuj膮 przede wszystkim operacje (np. kopiowanie czy usuwanie) na plikach i katalogach. Architektura j臋zyka Tcl zak艂ada, 偶e ka偶da operacja wej艣cia/wyj艣cia wymaga skorzystania z kana艂贸w, musimy o to zatroszczy膰 si臋 r贸wnie偶 w przypadku odczytu lub zapisu do plik贸w ulokowanych w naszym VFSie.

Tcl pozwala na tworzenie kana艂贸w w C, w Tcl oraz nak艂adanie warstw (stacking). Pierwsze dwie opcje pozwalaj膮 na stworzenie nowego typu kana艂u. Przyk艂adowo pakiet zipvfs implementuje w艂asne kana艂y w celu czytania plik贸w wprost z archiwum zip (bez czytania ca艂o艣ci pliku do pami臋ci). Najcz臋stszym rozwi膮zaniem jest jednak skorzystanie z gotowego rozwi膮zania 鈥 memchan.

Memchan jest rozszerzeniem Tcla stworzonym prze autora tego j臋zyka, pozwalaj膮cym na tworzenie kana艂贸w wej艣cia/wyj艣cia pod艂膮czonych do bufora w pami臋ci operacyjnej. Interfejs tego typu kana艂贸w jest taki sam jak przy dost臋pie do plik贸w lub socket贸w. Memchan jest przyk艂adem kana艂u zaimplementowanego w Tcl lub C 鈥 istniej膮 obie implementacje tego de facto standardu.

Tcl oferuje standardowe typy kana艂贸w 鈥 np. odczyt i zapis do plik贸w (natywny FS) oraz strumienie TCP/IP do komunikacji sieciowej.

Nak艂adanie warstw na kana艂y pozwala na rozszerzenie funkcjonalno艣ci istniej膮cego kana艂u 鈥 na przyk艂ad otwarcie pliku do odczytu i na艂o偶enie warstwy odpowiedzialnej za kompresj臋 czy szyfrowanie.

Czytanie lub zapis do pliku wymaga stworzenia kana艂u, kt贸ry pozwala na wykonanie tych operacji oraz - opcjonalnie - polecenia, kt贸re zostanie wykonane po zamkni臋ciu pliku (tzw. callback). Dzi臋ki temu korzystaj膮c z istniej膮cego mechanizmu memchan mo偶na zaimplementowa膰 podstawowe operacje na plikach 鈥 przy otwarciu pliku jego poprzednia zawarto艣膰 jest zapisywana do pami臋ci, po jego zamkni臋ciu nowa zawarto艣膰 jest zachowywana do pliku.

vfs::zip

Pierwsz膮 implementacj膮 VFS jak膮 om贸wimy jest pakiet vfs::zip b臋d膮cy cz臋艣ci膮 projektu tclvfs. Jak 艂atwo odgadn膮膰, pozwala on na dost臋p do struktur plik贸w zachowanych w archiwach zip. Aby praktycznie sprawdzi膰 jego dzia艂anie, wystarczy stworzy膰 archiwum zip dowolnym narz臋dziem, musimy uruchomi膰 konsol臋 Tcl (tclsh) i wpisa膰:

1
2
% package require vfs::zip
% vfs::zip::Mount /katalog/plik.zip /katalog/plik.zip

Pierwszy argument polecenia vfs::zip::Mount to 艣cie偶ka do archiwum, drugie to miejsce, w kt贸rym dane archiwum zostanie zarejestrowane. Pewnego rodzaju konwencj膮 jest montowanie pliku archiwum pod tak膮 sam膮 nazw膮 鈥 od tego momentu plik.zip b臋dzie przypomina艂 katalog.

Nast臋pnie mo偶emy ju偶 pracowa膰 z zawarto艣ci膮 archiwum tak jak ze wszystkimi innymi plikami. Dla przyk艂adu, aby skopiowa膰 plik z archiwum wystarczy wpisa膰:

1
% file copy /katalog/plik.zip/image.gif /tmp/image.gif

Wszystkie funkcje j臋zyka Tcl poprawnie obs艂uguj膮 pliki korzystaj膮ce z wirtualnych system贸w plik贸w 鈥 na przyk艂ad:

1
% image create photo 鈥file /katalog/plik.zip/image.gif

Spowoduje to wczytanie obrazka wprost z archiwum.

Zipvfs pozwala r贸wnie偶 na wykonywanie praktycznie wszystkich operacji, kt贸re mo偶na wykona膰 na natywnych systemach plik贸w:

1
2
3
foreach f [glob -directory plik.zip *] {
聽 聽 puts "[format "%s %s %4s bytes" $f [file type $f] [file size $f]]"
}

聽Wynikiem powy偶szego kodu mo偶e by膰 na przyk艂ad:

1
2
plik.zip/readme.txt file 20 bytes
plik.zip/image.gif file 10234 bytes

聽Po zako艅czeniu pracy warto odmontowa膰 dany udzia艂 poleceniem vfs::unmount . Konwencja ta dotyczy ka偶dej implementacji VFS.

Pakiet vfs::zip pozwala na otwieranie zar贸wno klasycznych archiw贸w, jak i takich, w kt贸rych skompresowana zawarto艣膰 poprzedzone s膮 innym ci膮giem danych 鈥 jak na przyk艂ad pliki samorozpakowuj膮ce. W艂a艣ciwo艣膰 ta bywa wykorzystywana do tworzenia skrypt贸w Tcl o zredukowanym rozmiarze: pocz膮tek pliku to skrypt, kt贸ry otwiera sam siebie jako archiwum zip oraz uruchamia w艂a艣ciwy kod.

Zipvfs oferuje jedynie funkcjonalno艣膰 odczytu zawarto艣ci archiwum, nie pozwala natomiast na wykonywanie zmian na plikach. Oczywi艣cie istniej膮 pakiety, pozwalaj膮ce na tworzenie archiw贸w zip z poziomu Tcl w bezpo艣redni spos贸b (bez emulacji systemu plik贸w).

vfs::http

Inn膮 ciekaw膮 implementacj膮 VFS jest obs艂uga zasob贸w dost臋pnych za pomoc膮 protoko艂u http. Pomimo istotnych ogranicze艅 w oferowanej przez ni膮 funkcjonalno艣ci mo偶e znakomicie u艂atwi膰 obs艂ug臋 komunikacji sieciowej, sprowadzaj膮c ca艂膮 procedur臋 pobrania danego zasobu do zwyk艂ego odczytu pliku. Jako przyk艂adem pos艂u偶my si臋 nast臋puj膮cym kodem:

Operacje na zasobach dost臋pnych pod adresem http://www.kernel.org/pub/linux/kernel s膮 przeprowadzane tak samo, jak na plikach lokalnych.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
proc head {filename count} {
聽 聽 puts "\n==== $filename"
聽 聽 set fp [open $filename r]
聽 聽 fconfigure $fp -buffering line

聽 聽 set i 0;
聽 聽 while {$i < $count} {
聽 聽 聽 聽 puts "> [gets $fp]"
聽 聽 incr i
聽 聽 }
聽 聽 close $fp
}

package require vfs::http
vfs::http::Mount "http://www.kernel.org/pub/linux/kernel" kernel
puts "file type of mounted resource: [file type kernel]"

file copy -force kernel/README readme.txt

head readme.txt 7
head kernel/v2.6/ChangeLog-2.6.38.3 7

vfs::unmount kernel

Procedura head jest odpowiednikiem analogicznej komendy linuxowej, i ma za zadanie wypisa膰 na ekran wyspecyfikowan膮 ilo艣膰 linii z danego pliku.

Kod odpowiedzialny za komunikacj臋 http znajduje si臋 w pakiecie vfs::http.

Komenda vfs::http::Mount "http://www.kernel.org/pub/linux/kernel" kernel powoduje utworzenie w bie偶膮cym katalogu wirtualnego zasobu (punktu montowania) o nazwie kernel. Obecna implementacja pozwala na traktowanie tego zasobu jako read-only>. Przy okazji pokazali艣my jedno z jej ogranicze艅 鈥 pomimo 偶e kernel b臋dziemy traktowa膰 jak katalog, Tcl traktuje go jako zas贸b typu file. Nast臋pne komendy ilustruj膮 brak r贸偶nic pomi臋dzy dost臋pem do plik贸w lokalnych a dost臋pnych po http. Kopiujemy zdalny plik README na lokalny readme.txt, a nast臋pnie wypisujemy z niego pierwsze 7 linii. Nast臋pne polecenie zrobi to samo bezpo艣rednio na zdalnym pliku http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.38.3, za艣 ostatnia komenda odmontowuje udzia艂 kernel, zwalniaj膮c u偶yte zasoby sieciowe. Wynik dzia艂ania powy偶szego kodu to:

Wynik uruchomienia powy偶szego kodu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
file type of mounted resource: file

==== readme.txt
>
> 聽 聽 聽 Linux kernel release 2.0.xx
>
> These are the release notes for linux version 2.0. 聽Read them carefully,
> as they tell you what this is all about, explain how to install the
> kernel, and what to do if something goes wrong.

==== kernel/v2.6/ChangeLog-2.6.38.3
> commit 1be99f6c95e6c887756f789a60d15771235acd0c
> Author: Greg Kroah-Hartman
> Date: 聽 Thu Apr 14 13:03:56 2011 -0700
>
> 聽 聽 Linux 2.6.38.3
>

Na powy偶szym przyk艂adzie zalety VFS贸w uwypuklaj膮 si臋 w ca艂ej okaza艂o艣ci. Pomimo 偶e kod korzysta z protoko艂u http, nie musimy zajmowa膰 si臋 zagadnieniami programowania sieciowego taki mi jak nawi膮zywanie po艂膮czenia, pobieranie zawarto艣ci czy obs艂uga timeout贸w itp.

Warto podkre艣li膰, 偶e w przypadku pakietu vfs::http tylko niekt贸re funkcje zosta艂y zaimplementowane: przyk艂adowo pr贸ba wylistowania zawarto艣ci podmontowanego zasobu poleceniem glob -directory kernel nie zadzia艂a. Pami臋tajmy r贸wnie偶 偶e protok贸艂 http nie zosta艂 zaprojektowany jako protok贸艂 zdalnego dost臋pu i zarz膮dzania plikami, co nak艂ada dodatkowe ograniczenia.

vfs::ftp

Obs艂uga protoko艂u ftp przez sterownik VFS nie r贸偶ni si臋 znacznie od opisanego powy偶ej http. Poni偶ej kod z poprzedniego przyk艂adu zmodyfikowany pod k膮tem u偶ycia ftp (definicja komendy head pozostaje bez zmian):

Operacje na zasobach dost臋pnych pod adresem ftp://ftp.kernel.org/pub/linux/kernel s膮 przeprowadzane tak samo, jak na plikach lokalnych.
1
2
3
4
5
6
7
8
9
package require vfs::ftp
vfs::ftp::Mount "ftp://ftp.kernel.org/pub/linux/kernel" kernel
puts "file type of mounted resource: [file type kernel]"

file copy -force kernel/README readme.txt
head readme.txt 7
head kernel/v2.6/ChangeLog-2.6.38.3 7

vfs::unmount kernel

Wynik dzia艂ania tego kodu jest identyczny z Listingiem 2 z t膮 r贸偶nic膮, 偶e Tcl prawid艂owo identyfikuje podmontowany zas贸b jako directory.
R贸wnie偶 implementacja vfs::ftp niesie ze sob膮 pewne ograniczenia, przyk艂adowo pr贸by wylistowania zawarto艣ci zdalnego katalogu czy okre艣lenia rozmiaru pliku z tego katalogu ko艅czy艂y si臋 niepowodzeniem.

vfs::urltype

Wspomnieli艣my wcze艣niej, 偶e TclVFS oferuje 2 tryby dost臋pu do VFS 鈥 poprzez punkt montowania, lub wolumen. Pierwszy z nich poznali艣my w poprzednich przyk艂adach 鈥 polega on na udost臋pnieniu konkretnego, zdalnego udzia艂u (zazwyczaj logicznego odpowiednika katalogu) jednoznacznie identyfikowanego przez podany adres, jako lokalny punkt montowania i wykonywanie na nim operacji.

Drugi tryb pozwala na zdefiniowanie wirtualnych nap臋d贸w typu ftp:// i http://. W tym przypadku identyfikacja interesuj膮cego nas zasobu ma miejsce dopiero w chwili wykonywania na nim konkretnej operacji, co implikuje u偶ywanie bezwzgl臋dnych 艣cie偶ek (URL). U偶ycie pakietu vfs::urltype wygl膮da nast臋puj膮co:

Zastosowanie pakietu vfs::urltype
1
2
3
4
5
6
7
package require vfs::urltype
vfs::urltype::Mount ftp
vfs::urltype::Mount http
head ftp://ftp.kernel.org/pub/linux/kernel/README 7
head http://www.kernel.org/pub/linux/kernel/README 7

puts [file volumes]
Pierwsz膮 czynno艣ci膮 po za艂adowaniu pakietu jest podmontowanie wirtualnych nap臋d贸w ftp:// i http://. Po wykonaniu tej akcji, mo偶emy operowa膰 na zdalnym zasobie tak samo jak w poprzednich przyk艂adach, przy uwzgl臋dnieniu jego pe艂nego adresu URL. Ostatnia komenda file volumeszwraca wszystkie (fizyczne i wirtualne) nap臋dy jakich dany interpreter Tcla jest 艣wiadom 鈥 w tym przypadku jest to lista: ftp:// http:// C:/.

Mk4vfs

Mk4vfs to pakiet umo偶liwiaj膮cy dost臋p do baz danych w formacie Metakit jak do kolejnego archiwum plik贸w. Standard ten zosta艂 stworzony 艣ci艣le z my艣l膮 o j臋zyku Tcl. Autor, Jean-Claude Wippler jest r贸wnie偶 tw贸rc膮 bazy danych Metakit, oraz rozwi膮zania Tclkit, kt贸re opiszemy w nast臋pnym artykule. Nadmienimy tylko, 偶e pocz膮tkowo do budowania aplikacji jednoplikowych wykorzystywany by艂 format ZIP. Jednak偶e z powodu problem贸w z zapisywaniem do archiwum powsta艂 mk4vfs鈥 pozwalaj膮cy na odczyt i zapis z archiwum.

Metakit jest specyficznego rodzaju baz膮 danych, 艂膮cz膮c膮 w艂asno艣ci relacyjne i obiektowe. Podobnie jak SQLite, jest przeno艣na i osadzalna w r贸znych 艣rodowiskach (istniej膮 API w j臋zykach C++, Python i Tcl). Jej elastyczna struktura pozwala na u偶ywanie jej baz danych jako kontener贸w przechowuj膮cych pliki i katalogi.


Podstawow膮 zalet膮 pakietu jest pe艂na obs艂uga odczytu i zapisu. Dzi臋ki korzystaniu z bazy danych Metakit, wszystkie zmiany w systemie plik贸w s膮 transakcyjne 鈥 co sprawia, 偶e nawet w przypadku przerwania operacji zapisu plik贸w, nie dochodzi do uszkodzenia archiwum.

Sk艂adnia jest bardzo podobna do operacji na archiwach zip. Je艣li chcemy otworzy膰 archiwum mk4 musimy wykona膰 nast臋puj膮ce polecenia:

1
2
package require vfs::mk4
vfs::mk4::Mount /katalog/plik.mk4 /katalog/plik.mk4

Pierwszy argument to 艣cie偶ka do archiwum, drugi to punkt montowania. W przypadku gdy plik nie istnieje, jest on automatycznie tworzony. Standardowo archiwum otwierane jest w trybie do odczytu i zapisu.
Je艣li chcemy otworzy膰 archiwum w trybie tylko do odczytu, musimy doda膰 opcj臋 -readonly:

1
vfs::mk4::Mount /katalog/plik.mk4 /katalog/plik.mk4 -readonly

Wszelkie operacje wykonywane s膮 tak samo jak w przypadku archiw贸w zip. Natomiast w przypadku archiw贸w otwartych do odczytu i zapisu mo偶liwe jest te偶 tworzenie plik贸w w archiwum 鈥 na przyk艂ad:

1
file copy /tmp/image.gif /katalog/plik.mk4/image.gif

Poniewa偶 w przeciwie艅stwie do wcze艣niej opisanych VFS贸w mamy tutaj obs艂ug臋 zapisu, istotne jest 鈥瀋zyste" zamkni臋cie danego pliku poprzez jego odmontowanie:

1
vfs::unmount plik.mk4

Cookfs

Kolejnym formatem stworzonym g艂贸wnie z my艣l膮 o j臋zyku Tcl/Tk jest cookfs. Jest to format, kt贸ry podobnie do mk4vfs powsta艂 na potrzeby tworzenia jednoplikowych program贸w zawieraj膮cych Tcl oraz skrypty. Cookfs rozwi膮zuje problemy, kt贸re mo偶na spotka膰 przy pracy zar贸wno z formatem zip oraz mk4 鈥 pozwala na zapisywanie do archiw贸w oraz nie wymaga bibliotek C++ (co niejednokrotnie bywa problemem w przypadku starszych system贸w operacyjnych). Dodatkowo cookfs jest zoptymalizowany pod k膮tem du偶ej ilo艣ci ma艂ych plik贸w 鈥 podobnie jak formaty rar lub 7z, ma艂e pliki pakowane s膮 wsp贸lnie, przez co wynikowy rozmiar pliku jest mniejszy. Cookfs zostanie szczeg贸艂owo opisany w nast臋pnym artykule.
W przeciwie艅stwie do wy偶ej opisanych VFS贸w, cookfs nie jest cz臋艣ci膮 tclvfs i nale偶y go doinstalowa膰. Proces ten nie jest szczeg贸lnie skomplikowany i sprowadza si臋 do pobrania ze strony http://sourceforge.net/projects/cookit/ providera skompilowanego pod dan膮 platform臋 (cookfs jest napisany zar贸wno w Tcl jak i w C) i umieszczeniu go w katalogu wskazywanym przez zmienn膮 $auto_path interpretera (zazwyczaj jest to podkatalog lib).
U偶ytkowanie archiwum cookfs nie odbiega od sk艂adni mk4vfs i ilustruje je kod poni偶ej. W skrypcie tym kolejno:

  1. za艂adowali艣my pakiet vfs::cookfs
  2. utworzyli艣my archiwum plik.cfs podmontowane pod t膮 sam膮 nazw膮
  3. utworzyli艣my plik readme.txt wewn膮trz archiwum
  4. u偶ywaj膮c wcze艣niej opisanej procedury head wypisali艣my zawarto艣膰 pliku
  5. odmontowali艣my archiwum
Praca z cookfs
1
2
3
4
5
6
7
package require vfs::cookfs
vfs::cookfs::Mount plik.cfs plik.cfs
set channel [open plik.cfs/readme.txt w]
puts $channel "Hello from Cookfs!"
close $channel
head plik.cfs/readme.txt 1
vfs::unmount plik.cfs

聽Wynik dzia艂ania skryptu jest nast臋puj膮cy:

1
2
==== ./plik.cfs/readme.txt
Hello from Cookfs!

Podsumowanie

Zamieszczony w tym artykule opis realizacji wirtualnych system贸w plik贸w w j臋zyku Tcl oraz przegl膮d istniej膮cych implementacji stanowi膮 tylko przys艂owiowy wierzcho艂ek g贸ry lodowej. Nasz膮 intencj膮 by艂o przyst臋pne przedstawienie oferowanej przez Tcl funkcjonalno艣ci. Zainteresowanych tematem Czytelnik贸w zach臋camy do samodzielnego zg艂臋biania tematu. Poni偶ej zamieszczamy gar艣膰 przydatnych odno艣nik贸w:
W nast臋pnym artykule opiszemy tworzenie jednoplikowych, wykonywalnych aplikacji 鈥 oczywi艣cie z u偶yciem Tcla.

Piotr Be艂towski

Wojciech Kocjan

Last Updated on Saturday, 28 May 2011 09:08
 
Tcl 8.5 Network Programming book
Learning Nagios 3.0 book