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
usinglauset. See on süntaktiline suhkur, mis garanteerib objekti edastamise meetodileDispose(), mis sulgeb faili automaatselt isegi siis, kui koodis tekib viga. - Andmete lisamine:
StreamWriterkonstruktori teine parameeter (tõeväärtustrue) 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-catchblokke, et eraldada veatöötluse loogika tavalisest programmikoodist. - finally roll: Allikad märgivad, et
finallyblokk 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
foreachtsü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.Combinekasutamine 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.ReadAllLinesvõiFile.WriteAllLinesmeetodeid, 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}");
}
