Töö failidega

1. Faili kirjutamine ja lugemine (StreamWriter ja StreamReader)

Failide käitlemisel on kriitilise tähtsusega ressursside haldamine.

  • Vajadus sulgeda: Allikad rõhutavad, et failivoogude (nt StreamWriter) puhul tuleb need pärast kasutamist alati sulgeda. See hoiab ära mälulekked ja faili “lukustumise”, mis takistaks teistel protsessidel sellele ligi pääsemast.
  • using plokk: Parim praktika on kasutada using lauset. See on süntaktiline suhkur, mis garanteerib objekti edastamise meetodile Dispose(), mis sulgeb faili automaatselt isegi siis, kui koodis tekib viga.
  • Andmete lisamine: StreamWriter konstruktori teine parameeter (tõeväärtus true) määrab, kas andmed lisatakse faili lõppu (append) või kirjutatakse fail üle [viidatud koodinäide].

2. Vigade käsitlemine (try-catch)

Failisüsteemiga suhtlemine on alati riskantne (fail võib puududa, olla kirjutuskaitstud jne).

  • Struktureeritud veatöötlus: C# kasutab try-catch blokke, et eraldada veatöötluse loogika tavalisest programmikoodist.
  • finally roll: Allikad märgivad, et finally blokk on koht, kuhu panna puhastustegevused (nt faili sulgemine), sest see käivitub alati, sõltumata sellest, kas tekkis viga või mitte.

3. Dünaamiline andmehaldus listidega (List<T>)

Kui andmed on failist loetud, on neid mugav hallata listis, mis on dünaamiline andmekogu.

  • Tüübiohutus: C# listid on tugevalt tüübitud (nt List<string>), mis tähendab, et kompilaator kontrollib, et listi lisataks ainult õiget tüüpi andmeid.
  • Manipuleerimine: Allikad toovad välja, et listid võimaldavad elemente lihtsalt lisada (.Add()), eemaldada (.Remove()) ja kontrollida nende olemasolu (.Contains()).
  • Itereerimine: Listi läbimiseks ja sisu kuvamiseks kasutatakse tavaliselt foreach tsüklit, mis on mõeldud just kogumite töötlemiseks.

4. Parimad praktikad ja failitee haldus

  • Path.Combine: Erinevad operatsioonisüsteemid (Windows, Linux, macOS) kasutavad failiteedes erinevaid sümboleid. Path.Combine kasutamine tagab, et programm töötab korrektselt igal platvormil, ilma et programmeerija peaks käsitsi kaldkriipse haldama.
  • File abimeetodid: Lihtsate operatsioonide puhul on mugavam kasutada File.ReadAllLines või File.WriteAllLines meetodeid, mis avavad ja sulgevad faili automaatselt alltaustal [viidatud koodinäide].
  • Olemasolu kontroll: Enne failist lugemist on mõistlik kontrollida selle olemasolu meetodiga File.Exists(), et vältida programmi ootamatut katkemist [viidatud koodinäide].

Need põhimõtted aitavad luua robustseid ja turvalisi rakendusi, mis käitlevad väliseid ressursse korrektselt ja väärtustavad süsteemi ressursisäästlikkust

Näited:

1.Faili kirjutamine 

public static void retseptid()
        {
            try
            {

                string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Retseptid.txt");
                StreamWriter text = new StreamWriter(path, true);
                Console.WriteLine("Sisesta Itaalia toidu nime");
                string lause = Console.ReadLine();
                text.WriteLine(lause);
                text.Close();



            }
            catch (Exception)
            {
                Console.WriteLine("Mingi viga failiga");
            }

Kui kasutad StreamWriter või StreamReader

Siis pead kindlasti faili sulgema, näiteks:

StreamWriter sw = new StreamWriter(path);
sw.WriteLine(“Midagi”);
sw.Close(); // Vajalik!

Või parem lahendus:

using (StreamWriter sw = new StreamWriter(path))
{
sw.WriteLine(“Midagi”);
} // Fail suletakse automaatselt siin

2.Faili lugemine (StreamReader)

public static void retseptilistiavamine()
        {
            try
            {
                string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Retseptid.txt");
                StreamReader text = new StreamReader(path);
                string laused = text.ReadToEnd();
                text.Close();
                Console.WriteLine(laused);

            }
            catch (Exception)
            {
                Console.WriteLine("Mingi viga failiga, ei saa faili lugeda");
            } 


3. Ridade lugemine List<string> abil

public static List<string> Koostisosadelist(string fail)
        {
            List<string> KoostisOsade_list = new List<string>();
            try
            {
                string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "KoostisOsad.txt");
                foreach (string rida in File.ReadAllLines(path))
                {
                    KoostisOsade_list.Add(rida);
                }
            }
            catch (Exception)
            {
                Console.WriteLine("Viga failiga");
            }
            return KoostisOsade_list;
        }

4.Listi muutmine ja kuvamine

public static void Koostisosademuutmine(string fail)
        {
            List<string> KoostisOsade_List = Koostisosadelist(fail);

            foreach (string KoostisOsad in KoostisOsade_List)
            {
                Console.WriteLine(KoostisOsad);
            }
            KoostisOsade_List.Remove("Ketšup");

            if (KoostisOsade_List.Count > 1)
                KoostisOsade_List[1] = "Kvaliteetne Oliiviõli";

            Console.WriteLine(" kustutasime Ketšup");
            foreach ( string KoostisOsad in KoostisOsade_List)
            {
                Console.WriteLine(KoostisOsad);
            }

5.Otsing nimekirjast

 public static void Otsing(string file)
        {
            List<string> KoostisOsade_List = Koostisosadelist(file);
            Console.WriteLine("Sisesta Koostisosa nimi, mida otsida:");
            string otsitav = Console.ReadLine();

            if (KoostisOsade_List.Contains(otsitav))
                Console.WriteLine("KoostisOsa " + otsitav + " on olemas.");
            else
                Console.WriteLine("Sellist KoostisOsa pole.");
        }
        public static void Koostisosadesalvestamine(string file)
        {
            List<string> KoostisOsade_List = Koostisosadelist(file);
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Kuud.txt");
            File.WriteAllLines(path, KoostisOsade_List);
            Console.WriteLine("Koostis osad on salvestatud.");

        }

6.Listi salvestamine tagasi faili

public static void SalvestAndmedFaili()
        {
            Console.WriteLine("Salvestatakse andmed faili...");
            try
            {
                List<string> failiread = new List<string>();
                foreach(Menuu item in menuuList)
                {
                    failiread.Add(item.VormidaFailijaokrea());
                }
                File.WriteAllLines(menuuPath, failiread);
                Console.WriteLine("Andmed on edukalt salvestanud faili");
            }
            catch(Exception e)
            {
                Console.WriteLine($"Andmete salvestamisel tekkis viga: {e.Message}");
            }