11/04/20151 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
11/04/20152 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
11/04/20153 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
11/04/20154 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)
11/04/20155 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í načtený byte Pro načtení, resp. zápis jednoho bytu je možné použít metodu ReadByte, resp. WriteByte
11/04/20156 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
11/04/20157 Třída FileStream (5) Soubory lze uzavřít voláním metody Close Je zapotřebí, aby soubor byl uzavřen za všech okolností 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 Za účelem uvolňování zdrojů existuje rozhraní IDisposable definující metodu Dispose, která příslušný zdroj uvolní
11/04/20158 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
11/04/20159 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
11/04/ 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
11/04/ 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
11/04/ 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
11/04/ Třída StreamReader (2) –string ReadLine() : 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)
11/04/ 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() : zapisují data různých datových typů (v závislosti na pře- tížené variantě) do proudu za poslední zapsaný znak zapisují symbol konce řádku
11/04/ 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
11/04/ 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
11/04/ 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
11/04/ 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