![]() |
|
||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
a A | h H | o O | j J |
mem
Magie začíná. V druhé části, tedy ve funkci main
, vytváříme pole těchto struktur. Pole má 4 prvky a každý prvek zabírá v paměti 2 znaky (byty). Přetypováním tohoto pole na pole bytů získáme zase pole o čtyřech prvcích. První byte ukazuje na první znak první struktury, druhý na druhy znak první struktury, třetí na první znak druhé struktury a čtvrtý na druhý znak druhé struktury. Ale protože potřebujeme zapsat všechny prvky v poli mem
, musíme metodě write
předat jako druhý parametr velikost jedné datové struktury. Metoda write
pak bude správně číst data z paměti od adresy proměnné mem
po adresu mem + mem.length * sizeof(Data)
.
sizeof
, věřte, že vrací velikost typu v bytech.uint8
.read a write
je bohužel velmi zavádějící chyba. Metody se opravdu chovají tak, jak jsem popsal, což si lze snadno ověřit studiem vygenerovaného C souboru.Než takový soubor otevřeme, je vhodné ho například otestovat, zda existuje. Někdy navíc potřebujeme se souborem dělat další „systémové“ věci. Kopírovat ho, vytvářet, měnit jeho parametry, získat jeho cestu atd. K tomu slouží třída File
z balíčku gio
. V minulém díle jsem naznačil cosi o dalších vala knihovnách – balíčcích. S těmi se budeme postupně setkávat, dnes použijeme první z nich. Něž k tomu však dojde, malinko odbočím.
Dalo by se říci, že balíček je synonymum pro knihovnu. Je třeba ale mít na paměti, že tomu tak vždy nemusí být. Autor dotyčného vapi (vala api) balíčku, může za jeden takový balíček schovat podporu několika souvisejících knihoven, nebo obráceně, jednu knihovnu rozdělit do několika balíčků. Standardní vala balíček odpovídá balíčku definovaného přes pkg-config
. Pkg-config je nástroj, který vrátí potřebné informace pro kompilování a linkování s danou knihovnou. Tento nástroj využívá celá rodina GNOME knihoven, od té nejspodnější – GLib, až po tu nejvyšší - GNOME. A možná nejen díky tomu, že podporuje i závislosti, nebo kontrolu verzí, existuje podpora pkg-configu napříč celým open-source světem. Jedna knihovna, má často několik samostatných balíčků, a tak do budoucna budu vždy uvádět pouze balíček, a případně i celou knihovnu, ze které balíček je.
Nyní už si můžeme ukázat malý kód na testování přítomnosti souboru.
public static int main (string[] args) {
// vytvoření třídy jedním z konstruktorů:
File file = File.new_for_path ("ctime.txt");
if (file.query_exists ()) { // kontrola zda soubor existuje
stdout.printf ("Soubor '%s' existuje\n", file.get_path());
} else { // nebo nikoli
stdout.printf ("Soubor 'ctime.txt' neexistuje\n");
}
return 0;
}
Uvedený příklad kompilujeme, je však nutné uvést balíček gio
, jež obsahuje třídu File
:
~$ valac file_exist.vala --pkg=gio-2.0
Co se vlastně v programu děje? Nejprve vytvoříme objekt file
, podobně jako v případě FileStream
, jednou ze statických metod. Třída File
má několik statických metod pro vytváření svých instancí, my vytváříme objekt z názvu souboru včetně cesty, konkrétně z relativní cesty. No a proč neuvádím namespace ? Protože balíček gio
patří do rodiny GLib knihoven, a tak používá GLib
namespace, který jak už jsme si řekli, je standardně integrován do všech vala programů.
Zbytek kódu testuje, zda soubor existuje, a pokud existuje, je vypsána celá jeho cesta. To znamená, že relativní cesta je doplněna o aktuální adresář, ve kterém se program pouští, a tedy ve kterém se soubor ctime.txt
nachází.
Třída File
obsahuje mnoho zajímavých metod, některé dokonce rovnou otvírají soubory pro čtení nebo zápis. Jsou to například metody append_to, crate, read
nebo jejich asynchroní modifikace. Tyto metody vrací objekty, které reprezentují opravdové soubory. Nejde však o FileStream
ale o InputStream, OutputStream
nebo IOStream
, který je zastřešuje, nikoli však objektově (oba objekty jsou vlastnostmi).
Tyto třídy jsou též součástí gio
balíčku, dědí z třídy GLib.Object
a tedy dědí i její vlastnosti jako je ref_count
nebo signal notify
. Všechny zmíněné třídy z gio
balíčku již pracují s výjimkami.
public static int main (string[] args) {
// Vytvoří třídu file, nikoli soubor test.log
File file = File.new_for_path ("test.log");
try { // v bloku může nastat výjimka
// až zde se vytvoří soubor test.log, pokud ovšem neexistuje
FileOutputStream os = file.append_to (FileCreateFlags.NONE);
// objekt string, má vlastnost data, která je čirou náhodou uint8[]
os.write ("Další nový řádek\n".data);
// odchycení výjimky GLib.Error
} catch (Error e) { // odchycení výjimky
stdout.printf ("Error: %s\n", e.message);
return 1;
}
return 0;
}
Jak je v ukázce uvedeno, vytvoření objektu file
rozhodně nevytváří žádný soubor. To je mimo jiné také důvod proč tato třída nemá žádnou metodu close
. Zato jeho metoda append
, již soubor vytváří, parametrem mu říkáme zda má soubor vytvořit přístupný všem, nebo jen uživateli, pod nímž je program spuštěn. O to jak se to děje na různých systémech se starat nemusíme, na každém to znamená něco jiného. Většina knihoven, které budeme používat a na kterých je Vala, resp, GTK, potažmo GNOME postaveno, obsahuje jistou míru abstrakce, díky níž nemusíte větvit program podle toho, na jakém systému byl spuštěn.
Třída FileOutputStream
má mimo jiných metodu write
, které se stejně jako v případě FileStream
předává pole čísel – bytů. A čirou náhodou objekt string
, i když je to objekt spíše abstraktní, obsahuje vlastnost data
, která se nám hodí. A ani zde soubor nezavíráme, i když nám to třída FileOutputStream
dovoluje. I zde platí že ztráta reference na objekt vyvolá destruktor, a ten se o vše postará sám. Ve vygenerovaném C souboru již žádné volání close
nenajdete, to proto, že jde o potomky třídy GLib.Object
a u nich se i v čistém C volá „destruktor“ funkcí g_object_unref
. To mimo jiné znamená, že tuto funkcionalitu mají třídy z gio
balíčku i ve své čisté C podobě.
K výjimkám se ještě dostaneme, proto jejich popis zatím vynechám a kód řádně otestujeme. Zkompilujeme, dvakrát spustíme, změníme práva výstupního souboru, a ověříme, že opravdu došlo k chybě.
~$ valac append_to_log.vala –pkg=gio-2.0
~$ ./append_to_log
~$ ./append_to_log
~$ chmod u-w test.log
~$ ./append_to_log
Balíček gio
toho však obsahuje daleko víc, než jen pár tříd pro práci se soubory. Umí pracovat i s disky, sockety, sítí, nebo třeba s uživatelským nastavením aplikace. Pokud budete potřebovat nějaký balíček, pomocí nějž byste otvírali soubory ze sítě, gio
je ten, který hledáte. Vedle gio
balíčku existuje ještě gio-unix
, ten obsahuje třídy, jenž využijete jen na unixových systémech (unix socket nebo disková přípojná místa).
Od příštího dílu již začneme probírat grafické rozhraní GTK+. Je toho celkem dost, tak doufám že se máte na co těšit. Na úplný závěr ještě zmíním, že gio
je součástí GLib knihovny (je distribuován pohromadě), tedy zatím používáme to, co je pro Valu nejzákladnější vybavení.
knihovna GLib
Vala dokumentace ke GLib.FileStream
knihovna GIO
Vala dokumentace gio balíčku
pkg-config
Příručka programu pkg-configl
|
||
KOMENTARZE
Nie ma komentarzy dla tej pozycji. |
||
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
1. |
Pacman linux Download: 5093x |
2. |
FreeBSD Download: 9307x |
3. |
PCLinuxOS-2010 Download: 8795x |
4. |
alcolix Download: 11188x |
5. |
Onebase Linux Download: 9908x |
6. |
Novell Linux Desktop Download: 0x |
7. |
KateOS Download: 6458x |
1. |
xinetd Download: 2619x |
2. |
RDGS Download: 937x |
3. |
spkg Download: 5243x |
4. |
LinPacker Download: 10385x |
5. |
VFU File Manager Download: 3394x |
6. |
LeftHand Mała Księgowość Download: 7482x |
7. |
MISU pyFotoResize Download: 3086x |
8. |
Lefthand CRM Download: 3755x |
9. |
MetadataExtractor Download: 0x |
10. |
RCP100 Download: 3371x |
11. |
Predaj softveru Download: 0x |
12. |
MSH Free Autoresponder Download: 0x |