Úvod do programování 8. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015
Umíme z minulé hodiny Algoritmy Hornerovo schéma Převod mezi číselnými soustavami Dlouhá celá čísla (reprezentace) Součet, rozdíl, součin, podíl Dlouhá reálná čísla (reprezentace) Zlomky (reprezentace) Syntax Konstanty Jan Lánský Úvod do programování 8. hodina 2
Cíle hodiny Soubory Textové (= textový režim přístupu) StreamReader, StreamWriter Binární (= binární režim přístupu) Syntax BinaryReader, BinaryWriter Čtení ze souboru a zápis do souboru Správa souborového systému Directory, File, Path, FileInfo Jan Lánský Úvod do programování 8. hodina 3
Přístup na disk Nepoužívat disk jako dočasné úložiště dat, která se vejdou do operační paměti Přístup na disk je o mnoho řádů pomalejší než přístup do operační paměti Disk jednotky milisekund, operační paměť desítky nanosekund (5 řádů) Zápis / čtení neprobíhá po bytech, ale po blocích Rozhraní programovacího jazyka umožňuje práci po jednotlivých bytech Buffrování (kompilátor), disková cashe Když v programu zapíšu data na disk, fyzicky se zapíší až později Práce se sousedními daty časově méně náročná než práce s daty různých částí souborů Jan Lánský Úvod do programování 8. hodina 4
using System.IO; Práce se soubory Pravé tlačítko myši na podtržený identifikátor Resolve 1. krok - Otevření souboru se zadaným jménem a režimem (čtení, zápis) Automatická kontrola existence, přístupových práv Pokud se soubor nepodaří otevřít vyvolá se chyba 2. krok - Čtení / zápis 3. krok - Zavření souboru OS umožňuje mít otevřený omezený počet souboru (řádově stovky) Při uzavření souboru se na disk zapíší obsahy bufferu na disk Pokud ukončíme program bez zápisu souboru na disk, ztratíme data z bufferu Dokud soubor nezavřeme, blokujeme ho ostatním Jan Lánský Úvod do programování 8. hodina 5
Textové vs. Binární soubory Textové Lidsky čitelný zápis Obsah dělen na řádky *.txt, *.html, *.xml Binární Lidsky nečitelné Hodnoty ve stejném tvaru jako uloženy v paměti Význam dat závisí na našem rozhodnutí *.exe, *.doc Jan Lánský Úvod do programování 8. hodina 6
Textové soubory čtení StreamReader otevření pro čtení new StreamReader(@"cesta k souboru") string s = @"cesta"; new StreamReader(s) Read() znak Vrací int, Konec souboru -1 Read(pole, start, pocet) pole znaků ReadLine() řádka ReadToEnd() do konce souboru Konec souboru null Peak() podíváme se následující znak, ale zůstane nepřečtený Close() uzavření souboru Vrací počet přečtených znaků. Konec souboru je 0 Soubory se musí zavírat Jan Lánský Úvod do programování 8. hodina 7
Cesta k souborům @ "retezec" Nepokusí se interpretovat znaky jako řídící znaky formátovacího řetězce Př.: @"..\novy" nebude odřádkovávat ("\n") Název souboru bez cesty Př.: @"soubor.txt", Najdeme v..\solution\project\bin\debug\ Absolutní cesta: Př.: @"C:\data\tmp\a.txt" Relativní cesta: Př.: @"..\..\a.txt" @ (alt + 64) Jan Lánský Úvod do programování 8. hodina 8
StreamReader Přečteme soubor po řádcích a vypíšeme ho obrazovku Práce se soubory Otevřeme pro čtení soubor se zadanou cestou Dokud jsou v souboru řádky Zavřeme soubor Cyklus lze nahradit přečtením celého souboru najednou Soubor se musí vejít do paměti Jan Lánský Úvod do programování 8. hodina 9
Textové soubory: ukázka Textové zobrazení Binární zobrazení Konec řádku Windows dva symboly 0A, 0D. Jiné OS jinak Jan Lánský Úvod do programování 8. hodina 10
Textové soubory zápis Existující soubor přepíše StreamWriter Otevření pro zápis new StreamWriter(@"cesta k souboru") Připojení na konec souboru: new StreamWriter(@"cesta k souboru", true) Write() cokoliv (17 verzí) Write(pole, start, pocet) pole znaků WriteLine() jako Write + odřádkuje Flush() zápis bufferů do souboru Close() uzavření souboru Soubory se musí zavírat Jan Lánský Úvod do programování 8. hodina 11
StreamWriter Přečteme soubor po řádcích vypíšeme ho do jiného souboru Počet řádků Otevřeme pro zápis Každých 1000 řádků budeme mít jistotu, že se data skutečně zapsala do souboru. Pojistka pro pád programu, zde není nutná Zavřeme oba soubory Flush úplně každého řádku by dost zpomaloval Jan Lánský Úvod do programování 8. hodina 12
Zápis pole Přečteme soubor po znacích a do dalšího souboru vypíšeme slova délky 5 a více. Každé slovo na novém řádku. Načteme 1 znak, později musíme přetypovat na char. Konec souboru -1 Slovo je souvislá posloupnost písmen Doufáme, že slova jsou kratší než 100, jinak chyba Začneme nové slovo Do souboru vypíšeme část pole, od indexu 0 do indexu 0 + delka - 1 Jan Lánský Úvod do programování 8. hodina 13
FileStream Soubor v Textovém režimu šel otevírat přímo new FileStream (@"cesta", FileMode) Obecné otevření souboru - nutné pro otevření souboru v binárním režimu FileMode výčtový typ Open Otevře existující soubor na začátku Append Otevře existující soubor na konci Create Vytvoří nový soubor Open je určen pro čtení Create je určen pro zápis Append je určen pro zápis formou logování Jan Lánský Úvod do programování 8. hodina 14
Binární soubory BinaryWriter zápis new BinaryWriter(FileStream) Write() 18 verzí pro různé datové typy BinaryReader čtení new BinaryReader(FileStream) Musíme načítat datové typy v odpovídajícím pořadí v jakém byly zapisovány. Jinak vzniknou nesmysly. ReadInt32(), ReadString(), 15 verzí Close() uzavření souboru Soubory se musí zavírat Jan Lánský Úvod do programování 8. hodina 15
Binární soubory ukázka Textové zobrazení Je nesmysl (zalomení řádek) Binární zobrazení Jan Lánský Úvod do programování 8. hodina 16
BinaryWriter Otevřeme binární soubor pro zápis Musíme uložit i délku pole Pro každý prvek pole uložíme hodnoty všech datových položek Zavřeme soubor Jan Lánský Úvod do programování 8. hodina 17
BinaryReader Načteme délku pole Otevřeme binární soubor pro čtení Zavřeme soubor Pro každý prvek pole musíme znát datové typy položek a pořadí v jakém jsme položky ukládali Jan Lánský Úvod do programování 8. hodina 18
Seek Textové soubory, konce řádku dva znaky 0D, 0A, nelze rozumně použít FileStream.Seek (posun, SeekOrgin) Nastavení se na konkrétní pozici v souboru (obdoba přístupu k prvku pole pomocí indexu) Má smysl jen pro binární soubory, které neobsahují řetězce proměnlivé délky (string) SeekOrgin Zamestnanec jmeno udělá Seek nepoužitelný Begin posun se počítá od začátku souboru End posun se počítá od konce souboru Seek(-1, SeekOrgin.End) posun na poslední platný znak Current posun se počítá od aktuální pozice Seek(-1, SeekOrgin.Current) posun o jeden znak zpět Jan Lánský Úvod do programování 8. hodina 19
Seek: příklad Ze souboru obsahujícího pouze 32bitová čísla načteme číslo se zadaným pořadím Zavřeme soubor Vytvoříme BinaryReader, který začíná číst na pozici, na které jsme nastaveni V souboru se nastavíme na místo, které obsahuje číslo, které chceme přečíst. Velikost datového typu * pořadí Přečteme číslo Jan Lánský Úvod do programování 8. hodina 20
Správa souborového systému Directory Zpřístupňuje funkce pro správu adresářů CreateDirectory, Move, Delete GetFiles, GetDirectories, GetParent File Zpřístupňuje funkce pro správu souborů Delete, Copy, Move, SetAttributes, GetAttributes FileInfo Length, Name, FullName Path GetFullPath, GetFileName, GetExtension Length velikost souboru, nezjistím z File Podobné FileInfo, ale nemusíme vytvářet proměnnou Jan Lánský Úvod do programování 8. hodina 21
2 rozměrná pole budou příští hodinu Příklad: Kopie souborů Vytvoříme adresář Návratová hodnota: Pole řetězců se jmény souborů Projdeme soubory Informace o aktuálním souboru Výpis názvu souboru a délky Okopírujeme soubor do zaloha true přepisovat existující soubory GetFileName Jméno souboru bez adresářů Jméno souboru změníme, aby bylo v adresáři zaloha Jan Lánský Úvod do programování 8. hodina 22
Pokračování z minulého slajdu Příklad: Smazání souborů Projdeme okopírované soubory Smažeme adresář Soubor smažeme Absolutní cesty k souborům vypíšeme na obrazovku Jan Lánský Úvod do programování 8. hodina 23
Zpětná vazba Objevili jste ve slajdech chyby? Včetně pravopisných Nechápete nějaký slajd? Je příliš obtížný, nesrozumitelný? Máte nějaký nápad na vylepšení? Anonymní formulář Odeslání za pár vteřin http://goo.gl/forms/wxkzqbszls Jan Lánský Úvod do programování 8. hodina 24