Tekstovne datoteke v C#

Tekstovne datoteke v C#

Avtor: Gregor Šoln

Kaj so tekstovne datoteke?

Tekstovna datoteka je vrsta računalniške datoteke, ki lahko hrani nize sestavljene iz alfanumeričnih znakov. Običajno so znaki brez vizulane informacije. Vsebina je golo besedilo. Vsebina tovrstnih datotek je lahko članek, knjiga, časopis, ali katero koli drugo besedilo.

(text_datoteka.png)
Tekstovna datoteka v okolju OS-X

Poleg osnovnih alfanumeričnih znakov lahko v tekstovnih datotekah hranimo še kup drugih vrst znakov. Za nas sta pomembna dva. Prvi znak, ki določa konec vrstice, s čemer določimo, kdaj se vrstica konča in sledi prehod v novo vrstico. Drugi takšen znak pa je znak za konec vsebine datoteke, ki določa kdaj se konec datoteke.

V programskem jeziku C# je za delo z tekstovnimi datotekami potrebno vključiti modul System.IO. Seveda pa je delo z datotekami omogočeno tudi brez uporabe tega modula, a je potrebno vnašati veliko daljše ukaze, kot če bi modul uporabljali.

File.CreateText() // modul je vključen
System.IO.File.CreateText() // modul ni vključen

Preverjanje obstoja datoteke

Preden datoteko ustvarimo je potrebno preveriti ali se mogoče datoteka z takšnim imenom že nahaj v direktoriju. Če bi datoteka z takšnim imenom, kot želimo poimenovati datoteko že obstajala, bi prvotno datoteko povozili in izgubili podatke. Zato je preverjanje obstoja datoteke v večini primerov priporočljivo.

Funkcija Exists

Funkcija Exists se uporablja za preverjanje obstoja datoteke. Ta funkcija nadzira le, če datoteke iz dane poti obstaja. Torej če datoteka obstaja funkcija vrn vrednost true, v nasprotnem primeru pa vrne vrednost false.
Za neveljavno pot do datoteke, funkcija vrne vrednost false. Zato če želimo preveriti ali pot vsebuje neveljavne znake, uporabimo funkcijo GetInvalidPathChars metodo, ki preverja pravilnosti poti.

Za parameter poti je dovoljeno navesti relativne ali absolutne podatke o poti. Relativna informacija poti razlaga kako pridi do mesta, glede na trenutni direktorij v katerem se nahajamo. Za pridobitev poti do trenutnega delovnega direktorija uporabimo funkcijo GetCurrentDirectory.

Če je opisana pot za preverjanje obstoja datoteke direktorij (imenik), funkcija Exists vrne false.

Funkcija Exists vrne vrednost false, če pride do napake medtem, ko se poskuša ugotoviti ali določena datoteka obstaja. To se lahko zgodi v situacijah, ko se sproži izjema.
Med takšne situacije spada tudi delo z datotekami katerih imena vsebujejo neveljavne znake ali pa jih imajojo preveč. Težave se pojavljajo tudi pri mankajoči disk, ali če kličoči objekt nima dovoljenja za upravljanja z datoteko.

string curFile = @"c:\temp\test.txt";
Console.WriteLine(File.Exists(curFile) ? "File exists." : "File does not exist.");

V zgornjem primeru imamo spremenljivko curFile, ki vsebuje pot in ime datoteke. Z ukazom File.Exist(curFile) izvemo ali datoteka z takšnim imenom že obstaja. Funkcija vrne true, če datoteka že obstaja in false, če na tem naslovu ni datoteke z takšnim imenom.

Ustvarjanje nove tekstovne datoteke

Tekstovno datoteko lahko ustvarimo na dva različna način, ki se med seboj razlikujeta le v načinu naslavljanja. Pot kjer se bo datoteka nahajala lahko podamo relativno ali absolutno. Med seboj se ta dva načina razlikujeta v tem, da se pri absolutnem naslavlanju pot vedno začne v korenskem direktoriju. Pri relativnem naslavlanju pa je pot odvisna od tega, v katerem direktoriju se trenutno nahajamo.

Preden datoteko ustvarimo je priporočljivo opraviti preverjanje obstoja, kljub temu pa lahko datoteko ustvarimo brez preverjanja njenega obstoja).

Kot smo omenili lahko datoteko ustvarimo tako, da pot kjer se bo datoteka nahajala, podamo absolutno. Datoteko ustvarimo z ukazom File.CreateText(pot + ime_datoteke).

File.CreateText("C:\\Users\\uporabnik\\Desktop\\test1.txt");
File.CreateText(@"C:\Users\uporabnik\Desktop\test2.txt");

Absolutno pot lahko podamo na dva načina. V prvem primeru je uporabljen dvojni back slash. V drugem primeru pa je uporabljen enojni back slash in @, ki pomeni, da je naslov poti podan dobesedno, in ni potrebno navajati dvojnih back slashov.

Če želimo pot podati relativno je potrebno najprej preveriti v katerem direktoriju se trenutno nahajamo. To storimo z ukazom File.GetCurrentDirectory(), ki vne pot do trenutnega direktorija. Nato pot do željenega direktorija začne na mestu kjer se trenutno nahajamo. Če želimo datoteko ustvariti na mestu kjer se trenutno nahajamo, podamo samo ime datoteke.

File.CreateText("test.txt");

V zgornjem primeru vidimo, da smo datoteko test.txt ustvarili v direktoriju, kjer se trenutno nahajamo. Če bi želeli, da se datoteka ustvari en direktorij višje bi pot podali v obliki: "..\test.txt". S pikicami pred back slashom napovemo, da se premaknemo za en direktorij po hiarhiji direktorijev višje.

(hir.png)

Zgornja slika prikazuje hirarhijo direktorijev. Zgornji levi direktorij predstavlja korenski direktoij. Na primer, če se nahajamo v direktoriju, ki je obarva rdeče in če želimo tekstovno datoteko ustvariti v direktoriju, ki je obarvan zeleno uporabimo relativno naslavlanje. Kjer pikice pomenijo, da se pomaknemo za en nivo po direktorijih višje, proti korenu.

File.CreateText("..\test.txt");

Video: Ustvarjanje datoteke

Pisanje na novo datoteko

Datoteko test.txt smo ustvarili. Ko datoteko odpremo vidimo, da je prazna in da nima vsebine. Vsebino ji dodamo tako, da nize vnašamo preko tipkovnice. Če želimo spremembe na datoteki obdržati, jih je potrebno shraniti. Tako bo ob naslednjem odpiranju datoteke vsebina ostala.
Za pisanje na datoteko je potrebno odpreti ustrezen podatkovni kanal, preko katerega bodo tekle informacije. Omenjeni kanal se imenuje StreamWriter, pisanje nizov na datoteko pa izvedemo z ukazom Write oz. WriteLine.

using (StreamWriter writer = new StreamWriter("test.txt"))
  {
      writer.Write("niz ");
      writer.WriteLine("niz 2");
      writer.WriteLine("nova vrstica");
  }

Dodajanje vsebine na obstoječo datoteko

Kako odpremo datoteko, ki že ima vsebino in ji želimo dodati nekaj novih nizov, si bomo ogledali v naslednjem poglavju. Opisali bomo postopek kako pišemo na datoteko, ne da bi izgubili prvotno vsebino datoteke.

(dat1.png)

Video: Pisanje na datoteko

Dodajanje vsebine na datoteko

Do sedaj smo prikazali primere, ko datoteko ustvarimo in jo pripravimo za nadaljnje delo. Z naslednjim primerom pa bomo prikazali kako datoteko, ki že ima neki vsebino, odpremo in ji DODAMO novo vsebino. Ko ustvarimo kanal StreamWriter, poleg naslova datoteke dodamo parameter, s katerim napovemo, ali gre za dodajanje vsebine na datoteko ali ne. Če je parameter nastavljen na vrednost true, prvotno vsebino datoteke obdržimo.

using (StreamWriter writer = new StreamWriter("test.txt", true))
  {
      writer.WriteLine("nova vsebina");
  }

Z dodatnim parametrom, ki ima vrednost true napovemo, da datoteko test.txt odpiramo v načinu dodajanja vsebine. Če bi bila vrednost drugega parametra nastavljena na false bi pomenilo, da odpiramo prazno datoteko.

(dat2.png)

Video: Dodajanje vsebine na datoteko

Branje iz datoteke

Branje iz datoteke poteka na podoben način kot poteka pisanje, le da poteka v obratni smeri. Za branje prav tako potrebujemo kanal preko katerega bodo tekli podatki. Branje datoteke poteka tako, da beremo vsako vrstico po vrsti. Ko pridemo do konca datoteke, se branje zaključi. Seveda vse to ne deluje avtomatsko, ampak je potrebno ves ta postopek opisati.
Za odprtje kanala uporabimo StreamReader, ki nam bo omogočal branje. Z ukazom ReadToEnd pa preberemo celotno vsebino. Z ukazom WriteLine pa vsebino v obliki niza izpišemo.

using (StreamReader sr = new StreamReader("test.txt"))
            {
                String vsebina = sr.ReadToEnd();
                Console.WriteLine(vsebina);
            }

V konzolnem oknu se bo izpisala vsebina datoteke, ki smo jo prebrali.

(vsebina.png)

Brisanje datoteke in njene vsebine

Brisanje datoteke izvedemo z ukazom File.Delete(imeDatoteke), ki nam celotno datoteko brez preverjanja izbriše. Seveda pa se lahko zgodi, da želimo datoteko obdržati, želimo pa izbrisati vso njeno vsebino. To lahko storimo na več načinov.

  • Lahko ustvarimo datoteko z istim imenom v istem direktoriju. V tem primeru bo nova datoteka povozila staro. S tem smo datoteki zamenjali.

File.CreateText(istoImeDatoteke);

  • Datoteko odpremo v načino pisanja na datoteko. S tem smo določili, da se kazalec, ki kažem kam se naj zapiše vsebina, postavi na začetek datoteke. Prvotna vsebina datoteke bo izbrisana, hkrati pa bo v datoteko že vnesena nova vsebina.

using (StreamWriter writer = new StreamWriter("test.txt"))
  {
      writer.WriteLine("nova vsebina");
  }

Literatura

0%
0%