Vizuális és eseményvezérelt programozás 2006 2007, II. félév BMF NIK Fájlok, stream-ek Fájlok és könyvtárak Stream-ek csoportosítása A stream-ek osztályhierarchiája Stream-ek használata Nagy Tibor BMF NIK, 2006 2007
Hallgatói tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendő anyag vázlatát képezik. Ismeretük szükséges, de nem elégséges feltétele a sikeres zárthelyinek, illetve vizsgának. Sikeres zárthelyihez, illetve vizsgához a jelen bemutató tartalmán felül a kötelezőirodalomként megjelölt anyag, a gyakorlatokon szóban, illetve a táblán átadott tudnivalók ismerete, valamint a gyakorlatokon megoldott példák és az otthoni feldolgozás céljából kiadott feladatok önálló megoldásának képessége is szükséges. 2
System.IO névtér típusai File, FileInfo Fájlok és jellemzőik kezelése Directory, DirectoryInfo Könyvtárak és jellemzőik kezelése FileStream Olvasás/írás fájlból/fájlba IO-kezelés StreamReader/ StreamWriter Szöveg típusú adatok olvasása/írása BinaryReader/ BinaryWriter Különböző típusú adatok olvasása/írása Felsorolás típusok a fájlnyitási módok, fájlhozzáférés, fájlmegosztás, és egyéb beállítások megadásához System.IO.Compression névtér típusai DeflateStream/ GZipStream Adat betömörítése, kitömörítése 3
A File osztály Statikus osztály, háttértáron elhelyezkedő fájlok kezelésére Metódusai: Create(string path, int buffersize, FileOptions options) Copy(string sourcefilename, string destfilename) Move(string sourcefilename, string destfilename) Delete(string path) Exists(string path) GetAttributes(string path) SetAttributes(string path, FileAttributes attributes) GetCreationTime(string path) Nem statikus változata a FileInfo osztály 4
A Directory osztály Statikus osztály, háttértáron elhelyezkedő könyvtárak kezelésére Metódusai: CreateDirectory(string path) Exists(string path) Delete(string path, bool recursive) GetDirectories(string path) GetCurrentDirectory(), SetCurrentDirectory(string path) GetFiles(string path) GetParent(string path) Nem statikus változata a DirectoryInfo osztály 5
A Path osztály Fájlnevet és elérési utat tartalmazósztringrészekre bontására használható Metódusai: GetDirectoryName(string path) GetFileName(string path) GetExtension(string path) GetFileNameWithoutExtension(string path) 6
Feladat 1. Készítsen grafikus felületűalkalmazást, amely az aktuális könyvtár tartalmát egy listadobozban jeleníti meg, illetve a listadobozban kijelölt fájlról/könyvtárról információkat (név, könyvtárnév, attribútumok, létrehozás dátuma, ideje) ír ki egy MessageBoxban. Házi feladat: Az alkalmazást bővítse ki úgy, hogy a kijelölt fájltlehessen törölni, illetve másolni, mozgatni egy megadott helyre. 7
Stream-ek osztályhierarchiája 8
Stream-ek csoportosítása Fizikai stream-ek Közvetlenül egy adott médiára ír/médiáról olvas Média: Memória (puffer, sztring, karaktertömb) Háttértár (fájl) Hálózat (ennek a tananyagnak nem témája) Soros port (ennek a tananyagnak nem témája) FileStream MemoryStream StringReader, StringWriter Logikai stream-ek Egy másik stream-re ír/stream-ről olvas BinaryReader, BinaryWriter StreamReader, StreamWriter BufferedStream DeflateStream, GZipStream 9
Stream-ek használata Megnyitás: A megfelelő stream-osztály példányának létrehozásával pl.: StreamReader sr = new StreamReader("proba.txt"); A Fileosztály metódusai (Create, Open, OpenRead, OpenWrite, CreateText, OpenText, AppendText) segítségével pl.: StreamReader sr=file.opentext("proba.txt"); Bezárás: A stream Close() metódusával pl.: sr.close(); Pozicionálás: A stream-eknagy része soros hozzáférésű. A pozícionálás ezeknél az író/olvasó metódusokkal történik. A közvetlen hozzáférésűstream-ekesetén lehetőség van a pozícionálásra a Seek(long offset, SeekOrigin origin)metódus segítségével. A SeekOrigin{ Begin, End, Current} felsorolás konstansaival adhatómeg, hogy honnan számítva mozduljon el offsetbyte-tal a fájlpointer. (FileStream, MemoryStream, BufferedStream) 10
A using utasítás Szintaxisa using (objektum-létrehozás) ( { utasítások; } A paraméterként létrehozott objektum(ok) által foglalt memóriaterület automatikus felszabadítása az utasításblokk végén (nem kell várni a GC-re) Példa: using (StreamReader ( sr = new StreamReader("proba.txt")) { string s, s1 = ""; while((s = sr.readline())!= null) s1 += s + "\n"; MessageBox.Show(s1); sr.close(); } 11
StreamWriter Szövegek fájlba írása meghatározott kódolás szerint StreamWriter(Stream s) StreamWriter(string filename) StreamWriter(string path, Encoding enc) StreamWriter(string path, bool append) StreamWriter(string path, bool append, Encoding enc) StreamWriter(string path, bool append, Encoding enc, int buffersize) Metódusai Write( ) : adott típusú adat kiírása WriteLine( ) : adott típusú adat kiírása soremeléssel Tulajdonságai NewLine: az újsor karakter AutoFlush: kiíródjon-e minden Write() után a kiírandó adat? Kódolás Az Encoding osztály statikus tulajdonságai (pl.: Encoding.UTF8) 12
StreamReader Adat olvasása szövegfájlból meghatározott kódolás szerint StreamReader(Stream s) StreamReader(string filename) StreamReader(string path, Encoding enc) StreamReader(string path, bool append) StreamReader(string path, bool append, Encoding enc) StreamReader(string path, bool append, Encoding enc, int buffersize) Metódusai Read() : egy karaktert olvas Read(char[] buffer, int offset, int count) : tömbbe olvas count darab karaktert ReadLine() : egy sort olvas Peek() : egy karakter előreolvasása Tulajdonságok: EndOfStream: jelzi a streamvégét Kódolás Az Encoding osztály statikus tulajdonságai (pl.: Encoding.UTF8) 13
Feladat 2. Az előzőfeladat kibővítéseként a listadobozban tárolt minden fájlról és könyvtárról írja ki az információkat egy szövegfájlba 14
FileStream Adatok fájlba írása/ fájlból olvasása bájtonként FileStream(string path, FileMode mode) FileStream(string path, FileMode mode, FileAccess access) FileStream(string path, FileMode mode, FileAccess access, FileShare share) FileStream(string path, FileMode mode, FileAccess access, FileShare share, int buffersize) Metódusai Read(byte[] buffer, int offset, int count) ReadByte() Write(byte[] buffer, int offset, int count) WriteByte() Seek(long offset, SeekOrigin origin) Tulajdonságai Length Position 15
Fájlmegnyitás módja: Felsorolás típusok FileMode{ Append hozzáfűzés. Ha nem létezik a fájl, létrehozza Create új fájl. Ha a fájl létezik, akkor felülírja CreateNew új fájl. Ha a fájl létezik, IOException Open fájl megnyitása. Ha a fájl nem létezik, FileNotFoundExc. OpenOrCreate megnyit, vagy létrehoz Truncate törlés és újralétrehozás } A fájlhozzáférés módja FileAccess { Read, ReadWrite, Write} Meghatározza, hogy más streamekmilyen módon férhetnek hozzáehhez a fájlhoz, amíg nyitva van: FileShare { Delete, None, ReadWrite, Write, Read} Egyéb beállítások FileOptions { Asynchronous, DeleteOnClose, Encrypted, None, RandomAccess, SequentialScan, WriteThrough} 16
BinaryReader / BinaryWriter Primitív típusú adatok beolvasását / kiírását teszik lehetővé BinaryReader(Stream input) BinaryReader(Stream input, Encoding encoding) BinaryWriter(Stream input) BinaryWriter(Stream input, Encoding encoding) Metódusaik: ReadX() WriteX(X data) X helyére a primitív típus.net osztálykönyvtárbeli nevét kell behelyettesíteni pl.: ReadDouble(), ReadSingle(), 17
MemoryStream A memóriából tud olvasni / memóriába tud írni MemoryStream(int capacity) MemoryStream(byte[] buffer) MemoryStream(byte[] buffer, bool writable) Metódusai: Read(byte[] buffer, int offset, int count) ReadByte() Write(byte[] buffer, int offset, int count) WriteByte() Seek(long offset, SeekOrigin origin) WriteTo(Stream dest) Tulajdonságai: Capacity Length Position 18
DeflateStream / GZipStream Adatok betömörítésére és kitömörítésére használható DeflateStream(Stream stream, CompressionMode mode) GZipStream(Stream stream, CompressionMode mode) A tömörítés iránya: CompressionMode{ Compress, Decompress} Metódusai: Read(byte[] buffer, int offset, int count) ReadByte() Write(byte[] buffer, int offset, int count) WriteByte() Seek(long offset, SeekOrigin origin) Tulajdonságai: Length Position 19
Feladat 3. Az előzőfeladat bővítése úgy, hogy a listadobozban kijelölt fájlt be lehessen tömöríteni megadott néven, ill. ki lehessen tömörítenik egy megadott helyre. 20