FILE IO
Enkel versjon
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace Replacer { class Program { static void Main(string[] args) { //args[ ]: file,textout,textin if (args.Length < 3) { Console.WriteLine("Brukes slik:"); Console.WriteLine("Replacer filenavn tekstut tekstin"); Console.Read(); } else { String txt = LoadText(args[0]); if (txt != null) { txt = txt.Replace(args[1], args[2]); StoreText(args[0], txt); } } } static String LoadText(String filename) { String inTxt = ""; FileStream s = new FileStream(filename, FileMode.Open); StreamReader r = new StreamReader(s); String line = r.ReadLine(); while (line != null) { inTxt = inTxt + line + "\n"; line = r.ReadLine(); } r.Close(); return inTxt; } static void StoreText(String filename, String txt) { FileStream S = new FileStream(filename, FileMode.Open); StreamWriter w = new StreamWriter(S); String[] lines = txt.Split('\n'); foreach(String line in lines) w.WriteLine(line); w.Close(); } } }
Kontrollert versjon
I motsetning til Java er det i C# lov å bruke metoder som lager unntak (exceptions) uten å fange dem opp (catch). Dette er av og til praktisk dersom vi har full kontroll over situasjonen. Svakheten er at det er lett å overse mulige feilsituasjoner, slik som vi har gjort i den enkle versjonen ovenfor.
Vi vil altså se spesielt på metodene LoadText og StoreText og se hvordan vi kan kontrollere disse slik at programmet vårt terminerer med en kontrollert feilmelding dersom filer ikke finnes eller ikke kan leses/skrives.
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace ReplacerX { class Program { static void Main(string[] args) { //args[ ]: file,textout,textin if (args.Length < 3) { Console.WriteLine("Brukes slik:"); Console.WriteLine("ReplacerX filenavn tekstut tekstin"); Console.Read(); } else { String txt = LoadText(args[0]); if (txt != null) { txt = txt.Replace(args[1], args[2]); StoreText(args[0], txt); } } } static String LoadText(String filename) { String inTxt = ""; FileStream s = null; StreamReader r = null; try { s = new FileStream(filename, FileMode.Open); r = new StreamReader(s); String line = r.ReadLine(); while (line != null) { inTxt = inTxt + line + "\n"; line = r.ReadLine(); } r.Close(); return inTxt; } catch (Exception e) { Console.WriteLine("Cannot read file because:"); Console.WriteLine(e.Message); return null; } finally { if (r!=null) r.Close(); } } static void StoreText(String filename, String txt) { FileStream s = null; StreamWriter w = null; try { s = new FileStream(filename, FileMode.Open); w = new StreamWriter(s); String[] lines = txt.Split('\n'); foreach(String line in lines) w.WriteLine(line); } catch (Exception e) { Console.WriteLine("Cannot write file because:"); Console.WriteLine(e.Message); return; } finally { if (w != null) w.Close(); } } } }
Vi har altså benyttet try, catch og finally. Merk at finally-blokken alltid eksekveres uavhengig av om vi har fått et unntak eller ikke, og uavhengig av om vi har en return-setning i try- eller catch blokken.