A mellékelt példában megvalósított feladat a következő: a NumericUpDown1 komponensbe megadott számokat Integer típusként kiírjuk egy tmp.dat állományba az első nyomógomb lenyomásakor. A kiírást úgy tesszük meg, hogy ha már van értékes adat az állományban, akkor az új számot mindig az állomány végére írjuk. A második gomb lenyomásakor a kiírt adatokat sorban beolvassuk, majd megjelenítjük ezeket a számokat egy ListBox komponensben, ahol minden számot egy-egy sorába írunk be.
Nézzük, miként történik a kiírás. Első lépésként megpróbáljuk megnyitni az állományt, ha az még nem létezne, akkor rögtön létrehozunk egyet. Ehhez a File osztály Open függvényét használjuk. Itt első paraméterként a megnyitandó, illetve a létrehozandó állomány nevét kell megadnunk. Második paraméterként pedig a FileMode felsorolt típus elemei közül választhatunk egyet. Az OpenOrCreate a megnyitást, vagy nem létezés esetén a létrehozást takarja. Az állományt minden esetben a programunk EXE-je mellett keressük, így annak elérési útját az Application osztályt StartupPath property-jéből vehetjük.
Állomány nyitás után az Open függvény egy Stream osztályt ad vissza, melyet egy ilyen típusú változóba eltárolunk.
Ahhoz, hogy íráskor mindig a legutolsó érték után írjuk a következőt, minden esetben az állomány végére kell állnunk még az írás megkezdése előtt. Ehhez a Stream osztály Seek függvényét használhatjuk. Ezzel mozoghatunk az állományon belül egy tetszőleges helyre. Itt első paraméterként azt kell megadnunk, hogy hány bájttal szeretnénk mozgatni az aktuális pozíciót. A második paraméter azt mondja meg, hogy ez az elmozdulás honnan történjen. Itt három lehetőség közül választhatunk:
- Begin – az állomány elejétől számítva
- Current – az aktuális pozíciótól számítva
- End– az állomány végétől számítva.
Miután az állomány végére álltunk, létrehozunk egy változót a BirnaryWriter osztályból. Ennek az osztálynak használatával igen egyszerűen lehetőségünk nyílik különféle típusú egyszerű adatok bináris formában történő írására. Így például Integer, String, Boolean, Char, stb. típusú adatainkat egyszerűen írhatjuk ki. A létrehozáskor a konstruktorban a már meglévő Stream osztályt adjuk át. Ezt felhasználva lesz képes a BinaryWriter arra, hogy írjon az állományba.
A kiíráshoz nincs más teendőnk, mint a Write függvényt használni, melynek 17 különféle változata létezik a különböző típusú adatok kiírásához. Mellékelt példában mi most a NumericUpDown1 komponens Value property-jének értékét adjuk át.
Kiírás után már csak annyi teendőnk van, hogy lezárjuk a megnyitott állományt a Stream osztály Close függvényének hívásával.
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim st As Stream = File.Open(Application.StartupPath + "\\tmp.dat", FileMode.OpenOrCreate)
st.Seek(0, SeekOrigin.End)
Dim bw As BinaryWriter = New BinaryWriter(st)
bw.Write(CType(NumericUpDown1.Value, Integer))
st.Close()
End Sub
A létrehozott állomány beolvasását szintén egy Stream osztály létrehozásával kezdjük, a File osztály Open függvényével. Adatok olvasásához most viszont egy BinaryReader osztályt használunk. Ennek konstruktoránál szintén a már meglévő Stream osztályt kell átadnunk. Az adatok kiolvasásához egy ciklust készítünk, mellyel végigolvashatjuk az állományunk összes számát és azokat megjeleníthetjük a ListBox komponensünkben. A ciklusváltozót négyesével növeljük, mivel egy-egy eltárolt szám is négy bájt hosszú. A ciklus így addig megy ahány bájt van az állományban. Ennek értékét a Stream osztály Length property-jéből tudhatjuk meg.
Az egyes számok kiolvasásához a BinaryReader osztály ReadInt32 függvényét használjuk, mely Integer típusként adja vissza az eltárolt számot. Mivel a ReadInt32 annyi bájttal lépteti az állomány aktuális pozícióját, amennyit olvas, így minden olvasás után a következő int számon fogunk állni, ezért külön léptetésre nincs szükségünk a ciklusmagban.
Olvasás után ismét csak annyi a teendőnk, hogy lezárjuk az állományt a Close függvénnyel.
Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Try
Dim st As Stream = File.Open(Application.StartupPath + "\\tmp.dat", FileMode.Open)
Dim br As BinaryReader = New BinaryReader(st)
ListBox1.Items.Clear()
Dim i As Integer
For i = 0 To st.Length - 1 Step 4
ListBox1.Items.Add(br.ReadInt32().ToString())
Next
st.Close()
Catch ex As Exception
MessageBox.Show(ex.Message.ToString())
End Try
End Sub