Exceptions
File-IO
Børre Stenseth
Moduler>Console>File IO

FILE IO

Hva
Lese og skrive tekstfiler

Vi lager en enkel applikasjon som skal lese inn en tekstfil, erstatte en deltekst med en annen og skrive fila tilbake. Vi lager først en minimumsversjon uten særlig kontroll. Etterpå ser vi hvordan vi kan bruke unntakshandtering (exception control) for å få bedre kontroll med mulige feilsituasjoner.

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.

Referanser

Koden er sitert i teksten

Vedlikehold
B.Stenseth, august 2005
(Velkommen) Moduler>Console>File IO (GUI-komponenter)