Soubory a proudy (1) Soubor (file) označuje pojmenovanou sadu dat uloženou na externím záznamovém médiu (např. HDD, CD, DVD, BD, tape) Proud (stream) představuje „prostředníka“ mezi zdrojem, resp. příjemcem dat (např. soubor) a našim programem Knihovny dodávané s MS .NET Frameworkem poskytují abstraktní třídu Stream (definována ve jmenném prostoru System.IO), jež mimo jiné definuje abstraktní metody pro operace: čtení z proudu – Read zápis do proudu – Write přesun v proudu – Seek 16/05/2018
Soubory a proudy (2) Skutečnost, zda daná operace je na konkrétním proudu dostupná, lze ověřit pomocí vlastností CanRead, CanWrite a CanSeek V jazyku C# lze pracovat např. s proudy: FileStream (System.IO): pro práci se soubory MemoryStream (System.IO): pro práci s proudy uloženými v operační paměti NetworkStream (System.Net.Sockets): pro komunikaci v prostředí počítačové sítě Poznámka: výše uvedené proudy jsou definovány jako potomci abstraktní třídy Stream 16/05/2018
Třída FileStream (1) Instance třídy FileStream se používají ke čtení a k úpravám obsahu souboru Při vytváření instance třídy FileStream je možné konstruktoru předat např.: název souboru (možno zadat včetně cesty) informace o režimu otevření souboru (FileMode): např. vytvoření nového souboru, otevření existujícího souboru, přidávání dat na konec souboru informace o režimu přístupu (FileAccess): soubor určený pro čtení, pro zápis nebo pro čtení i zápis informace o režimu sdílení (FileShare): udávají, zda je soubor určený výlučně pro daný proud, nebo jej současně mohou (pro specifikované operace) používat i jiné proudy 16/05/2018
Třída FileStream (2) Definuje např. vlastnosti: Length: vrací počet bytů v proudu Position: vrací nebo nastavuje aktuální pozici v proudu Načítání informací z proudu (souboru) se pro-vádí pomocí metody: int Read(byte[] a, int offset, int count) Metoda Read: načítá do pole a od indexu offset nejvýše count bytů vrací počet načtených bytů (nebo nulu, jestliže bylo dosaženo konce proudu) 16/05/2018
Třída FileStream (3) posouvá současnou pozici v proudu za poslední načtený byte Zápis informací lze realizovat pomocí metody void Write(byte[] a, int offset, int count) Metoda Write: zapisuje do proudu z pole a od indexu offset count bytů posouvá současnou pozici v proudu za poslední zapsaný byte Pro načtení, resp. zápis jednoho bytu je možné použít metodu ReadByte, resp. WriteByte 16/05/2018
Třída FileStream (4) Pro nastavení aktuální pozice v proudu slouží metoda long Seek(long offset, SeekOrigin origin) Parametr: offset: udává relativní pozici vzhledem k hodnotě parametru origin origin: specifikuje, zda pozice je vztažena k začátku, konci nebo aktuální pozici v proudu Metoda Seek vrací novou pozici v proudu Po dokončení práce se souborem by měl být příslušný proud uzavřen 16/05/2018
Třída FileStream (5) Soubory lze uzavřít voláním metody Close Metodu Close není nutné volat: stačí zajistit, aby každý proud byl korektně uvolněn je zapotřebí, aby proud byl uzavřen za všech okol-ností Za účelem uvolňování zdrojů existuje rozhraní IDisposable definující metodu Dispose, která příslušný zdroj uvolní Při práci se soubory by měly být použity bloky try a finally sloužící pro ošetření výjimek 16/05/2018
Třída FileStream (6) Příklad: FileStream fs; try { fs = new FileStream(”data.txt”); fs.Write(…); } finally { if (fs != null) fs.Dispose(); } Jazyk C# umožňuje zjednodušit použití rozhra-ní IDisposable pomocí klíčového slova using 16/05/2018
Třída FileStream (7) Příklad: using (FileStream fs = new FileStream(”data.txt”)) { fs.Write(…); } Pro čtení (zápis) z (do) proudů je možné také využít třídy: BinaryReader, BinaryWriter: pracují s otevřeným proudem (přístupným pomocí vlastnosti BaseStream) jako s binárním souborem dovolují číst (zapisovat) vestavěné datové typy StreamReader, StreamWriter: pracují s otevřeným proudem (přístupným pomocí vlast-nosti BaseStream) na úrovni znaků textu v nějakém kódování (standardně UTF-8) umožňují s obsahem souboru pracovat jako s textem 16/05/2018
Třída BinaryReader Definována ve jmenném prostoru System.IO Umožňuje načítání binárních hodnot Pro vytvoření její instance je zapotřebí mít otevřený proud Poskytuje zejména metody pro načítání hodnot vestavěných datových typů: ReadBoolean, ReadByte, ReadChar, ReadDecimal, ReadDouble, ReadInt16, ReadInt32, ReadInt64, ReadSByte, ReadSingle, ReadString, ReadUInt16, ReadUInt32, ReadUInt64 Po každém načtení se pozice v proudu posune za poslední načtený byte 16/05/2018
Třída BinaryWriter Definována ve jmenném prostoru System.IO Umožňuje zápis binárních hodnot Pro vytvoření její instance je zapotřebí mít otevřený proud Obsahuje 18x přetíženou metodu Write pro zápis různých vestavěných typů do proudu Při každém zápisu se automaticky posouvá pozice v proudu za poslední (zapsaný) byte Změnu aktuální pozice v proudu je možné provést i pomocí metody Seek 16/05/2018
Třída StreamReader (1) Definována ve jmenném prostoru System.IO Potomek abstraktní třídy TextReader Načítá znaky z proudu Načítání je možné realizovat pomocí metody: int Read(): načítá z proudu jeden znak reprezentovaný jako Int32 posunuje pozici v proudu za načtený znak int ReadBlock(char[] buffer, int index, int count): načítá do pole buffer od indexu index nejvýše count znaků vrací počet načtených bytů posunuje pozici v proudu za poslední načtený znak 16/05/2018
Třída StreamReader (2) string ReadLine(): string ReadToEnd(): načítá z proudu řádek znaků a vrací jej jako řetězec string ReadToEnd(): načítá z proudu všechny znaky od aktuální pozice až do jeho konce (vrací je jako řetězec) 16/05/2018
Třída StreamWriter Definována ve jmenném prostoru System.IO Potomek abstraktní třídy TextWriter Zapisuje znaky do proudu Zapisování je možné realizovat pomocí přetíže-ných metod: Write(): zapisují data různých datových typů (v závislosti na pře-tížené variantě) do proudu WriteLine(): za poslední zapsaný znak zapisují symbol konce řádku 16/05/2018
Třídy StringReader a StringWriter Definovány ve jmenném prostoru System.IO Třída: StringReader je potomkem třídy TextReader StringWriter je potomkem třídy TextWriter Umožňují práci obdobným způsobem jako třídy StreamReader a StreamWriter Operace však neprobíhají nad proudy (soubory), ale nad řetězci Vhodné pro práci s textovými informacemi ulo-ženými v operační paměti 16/05/2018
Manipulace se soubory K provádění operací se soubory (vytváření, ko-pírování, mazání, přesouvání, otevírání apod.) je možné využít třídy: File (System.IO): statická třída, která definuje statické metody, např.: Copy, Create, Delete, Exists, GetAttributes, GetCreationTime, Move, Open, SetAttributes, SetCreationTime FileInfo (System.IO): definuje: vlastnosti, např.: Attributes, CreationTime, DirectoryName, Exists, Extension, Length, Name instanční metody, např.: CopyTo, Create, Delete, MoveTo, Open 16/05/2018
Manipulace s adresáři K provádění operací s adresáři (vytváření, mazá-ní, přesouvání, zjišťování souborů a podadresářů v adresáři apod.) je možné využít třídy: Directory (System.IO): statická třída, která definuje statické metody, např.: CreateDirectory, Delete, Exists, GetCreationTime, GetCurrentDirectory, GetDirectories, GetFiles, GetLogicalDrives, Move, SetCreationTime, SetCurrentDirectory DirectoryInfo (System.IO): definuje: vlastnosti, např.: Attributes, CreationTime, Exists, Extension, Name instanční metody, např.: Create, CreateSubDirectory, Delete, GetDirectories, GetFiles, MoveTo 16/05/2018
Třída Path Statická třída, která provádí operace nad řetězci, jež obsahují informace o adresářových (soubo-rových) cestách Definuje statické metody, např.: ChangeExtension: mění příponu Combine: vytváří z pole řetězců cestu GetExtension: vrací příponu GetFileName: vrací jméno a příponu GetFileNameWithoutExtension: vrací jméno bez přípony GetRandomFileName: vrací náhodné jméno souboru nebo adresáře 16/05/2018
Serializace, deserializace (1) představuje uchování stavu objektu proces konvertování datových struktur nebo objektů uložených ve vnitřní paměti na posloupnost bytů, kterou lze následně uložit do nějakého úložiště (např. soubor, databáze), případně přenést sítí Deserializace: opačný proces k serializaci, tj. převedení posloup-nosti bytů na kopii původního objektu Pomocí serializace je možné např. ukládat data aplikace, ukládat její nastavení nebo zasílat data prostřednictvím počítačové sítě 16/05/2018
Serializace, deserializace (2) .NET Framework umožňuje provádět různé ty-py serializací, např.: binární: provádí serializaci v binárním formátu zachovává datové typy (identitu instance) na základě uložených dat je možné automaticky rekon-struovat původní objekt možné realizovat pomocí třídy BinaryFormatter SOAP: vhodná pro komunikaci mezi aplikacemi, které používají heterogenní architektury možné realizovat pomocí třídy SoapFormatter 16/05/2018
Serializace, deserializace (3) XML: provádí serializaci do formátu XML serializuje pouze veřejné vlastnosti a datové položky nezachovává datové typy možné realizovat pomocí třídy XmlSerializer 16/05/2018
Třída XmlSerializer (1) Definována ve jmenné prostoru System.Xml.Serialization Umožňuje serializaci (deserializaci) do (z) do-kumentů XML Dovoluje ovládat, jakým způsobem jsou objekty kódovány Třída, jejíž objekty chceme serializovat musí: obsahovat bezparametrický konstruktor, popř. žádný parametrický konstruktor být definována s přístupností public 16/05/2018
Třída XmlSerializer (2) Při vytváření instance třídy XmlSerializer (v době volání konstruktoru) se jako parametr předává typ objektů, jež budou serializovány (deserializovány) Poznámka: předávaný datový typ se specifikuje pomocí operá-toru typeof, popř. pomocí metody GetType Třída XmlSerializer poskytuje metody: Serialize: provede serializaci objektu prostřednictvím potomka třídy Stream, TextWriter nebo XmlWriter 16/05/2018
Třída XmlSerializer (3) Deserialize: provede deserializaci objektu vrácená hodnota je typu object Při serializaci pomocí třídy XmlSerializer je možné využít různé atributy, např.: [XmlIgnore]: vlastnost nebo datová položka, před níž je tento atribut uveden, nebude serializována [XmlAttribute(”Name”)]: provede změnu z párové značky na nepárovou hodnota vlastnosti (datové položky) bude uvedena v atri-butu Name 16/05/2018
Třída XmlSerializer (4) Serializaci do formátu XML lze také realizovat pomocí třídy DataContractSerializer: dovoluje serializaci i neveřejných členů (vlastností a datových položek) třída, jejíž objekty mají být serializovány, musí být označena atributem [DataContract] členy, které se budou serializovat musí být označeny atributem [DataMember] poskytuje metody: WriteObject: provede zápis do XML dokumentu nebo proudu ReadObject: provede načtení dat z XML dokumentu nebo proudu 16/05/2018
Třída BinaryFormatter (1) Definována ve jmenné prostoru System.Runtime.Serialization. Formatters.Binary Provádí serializaci (deserializaci) do (z) binár-ního formátu Třída, jejíž objekty chceme serializovat, musí: mít před svou definicí specifikovaný atribut [Serializable] obsahovat pouze serializovatelné členy (výjimku tvoří datové položky, u nichž je použitý atribut [NonSerialized]) 16/05/2018
Třída BinaryFormatter (2) Konstruktoru se nepředává informace o typu serializovaných objektů Poskytuje metody: Serialize: provede serializaci objektu do zadaného proudu (potomek třídy Stream) Deserialize: provede deserializaci objektu ze zadaného proudu vrácená hodnota je typu object 16/05/2018
JSON serializace (1) Serializaci (deserializaci) do (z) notace JSON (JavaScript Object Notation) lze učinit pomocí třídy DataContractJsonSerializer V době volání konstruktoru se předává typ, je-hož objekty budou serializovány Třída DataContractJsonSerializer poskytuje metody: WriteObject: provede serializaci do notace JSON ReadObject: provede deserializaci z notace JSON 16/05/2018
JSON serializace (2) JSON serializaci je možné realizovat i pomocí třídy JsonConvert: nutné nainstalovat balíček Json.NET (http://www.newtonsoft.com/json) třída je definována ve jmenném prostoru Newtonsoft.Json poskytuje metody: SerializeObject: vrací serializovaný objekt jako řetězec (string) DeserializeObject: na základě zadaného řetězce a parametrizovaného typu objektu provede deserializaci 16/05/2018
Práce s databázemi (1) .NET Framework poskytuje prostředky pro pří-stup k různým typům databází Pro zpřístupnění konkrétní databáze je nutné se k ní nejprve připojit: připojení lze realizovat pomocí některého z potom-ků abstraktní třídy DbConnection Mezi potomky třídy DbConnection patří: SqlConnection: slouží pro připojení k databázi SQL serveru 16/05/2018
Práce s databázemi (2) OleDbConnection: OdbcConnection: pro připojení k databází podporující OLE DB, např. MS Access OdbcConnection: umožňuje připojení k databázi podporující ODBC (Open Database Connectivity) OracleConnection: slouží pro připojení k databázi Oracle EntityConnection: určena pro připojení ke konceptuálnímu modelu a zdroji dat 16/05/2018
Práce s databázemi (3) Pro reprezentaci příkazů SQL nebo uložených procedur, které mají být spuštěny jsou k dispo-zici potomci abstraktní třídy DbCommand Tyto třídy jsou specifické pro konkrétní data-báze a patří mezi ně: SqlCommand OleDbCommand OdbcCommand OracleCommand EntityCommand 16/05/2018
Práce s databázemi (4) Pro načítání řádků ze zdroje dat lze využít po-tomky abstraktní třídy DbDataReader, např: SqlDataReader OleDbDataReader OdbcDataReader OracleDataReader EntityDataReader Poznámka: třídy založené na DbConnection, DbCommand a DbDataReader se označují jako Data Providers (poskytovatelé dat) 16/05/2018
Třída SqlConnection (1) Definována ve jmenném prostoru System.Data.SqlClient Reprezentuje spojení s databázovým serverem SQL Je definována s modifikátorem sealed nel-ze na základě ní definovat třídu jako jejího po-tomka Připojení k SQL serveru je realizováno zadáním tzv. připojovacího řetězce (connection string) 16/05/2018
Třída SqlConnection (2) Připojovací řetězec může být zadán: v době volání konstruktoru (jako parametr) pomocí vlastnosti ConnectionString příklad: ”server=localhost;user=root; database=test” Poskytuje metody: Open: otevře spojení s databázovým serverem Close: uzavře dříve otevřené spojení s databázovým serverem 16/05/2018
Třída SqlConnection (3) Otevření a uzavření databáze je časově poměrně náročná operace je využíván fond připojení Poznámka: parametry fondu připojení lze nastavit v připojova-cím řetězci 16/05/2018
Třída SqlCommand (1) Definována ve jmenném prostoru System.Data.SqlClient Reprezentuje příkaz SQL (nebo uloženou proce-duru), který se má spustit na SQL serveru Definována s modifikátorem sealed SQL příkaz, který se má provést může být spe-cifikován: v době volání konstruktoru prostřednictvím vlastnosti CommandText 16/05/2018
Třída SqlCommand (2) Hodnota vlastnosti CommandText je interpre-tována dle hodnoty vlastnosti CommandType: Text: příkaz SQL (implicitní hodnota) TableDirect: jméno tabulky StoredProcedure: jméno uložené procedury Pro provedení příkazu SQL je rovněž nutné uvést databázové spojení (získané při vytváření instance třídy SqlConnection) Spojení lze zadat: v době volání konstruktoru pomocí vlastnosti Connection 16/05/2018
Třída SqlCommand (3) Spuštění příkazu se provádí voláním metody: ExecuteNonQuery: určena pro příkazy, které nevrací žádnou hodnotu (např. INSERT, DELETE apod.) vrací počet ovlivněných řádků ExecuteReader: používáno v případě, že SQL příkaz vrací množinu dat (např. příkaz SELECT) vytváří (vrací) instanci třídy SqlDataReader, pomocí níž je možné získat vrácená data 16/05/2018
Třída SqlCommand (4) ExecuteScalar: používána pro příkazy, které vrací jednu hodnotu (např. SELECT s agregační funkcí) vrací první sloupec prvního řádku ve výsledné množině nebo null (pokud výsledná množina je prázdná) vrácená hodnota je typu object 16/05/2018
Třída SqlCommand (5) Třída SqlCommand obsahuje mimo jiné vlast-nost Parameters: specifikuje kolekci parametrů spojených s příkazem SQL přidání parametru do kolekce společně s jeho hod-notou se provádí pomocí metody AddWithValue Poznámka: parametry jsou (v příkazu SQL) zapisovány pomocí zástupných značek uvozených symbolem @ 16/05/2018
Třída SqlDataReader (1) Definována ve jmenném prostoru System.Data.SqlClient Umožňuje načítání (zpřístupňování) řádků z da-tabáze SQL Prochází množinu dat po jednotlivých (řádcích) záznamech Její instance je vrácena jako výsledek volání metody ExecuteReader Pro přesun na následující záznam (řádek) slouží metoda Read 16/05/2018
Třída SqlDataReader (2) Metoda Read vrací hodnotu: true: jestliže existují další řádky false: v opačném případě Jednotlivé atributy záznamů jsou přístupné po-mocí indexu (indexování začíná vždy od nuly) nebo názvu sloupce zapsaného v hranatých závorkách, případně pomocí metod Get… Po ukončení práce s objektem třídy SqlData-Reader je zapotřebí provést jeho uzavření po-mocí metody Close 16/05/2018