Citirea și scrierea fișierelor text. StreamReader și StreamWriter
Pentru lucrul direct cu fișierele text, în spațiul de nume System.IO sunt definite clase speciale: StreamReader și StreamWriter.
Scrierea în fișier cu StreamWriter
Pentru scrierea în fișiere text se utilizează clasa StreamWriter. Câțiva dintre constructorii acestei clase, care pot fi folosiți pentru crearea unui obiect StreamWriter, sunt:
- StreamWriter(string path): parametrul path specifică calea către fișierul care va fi asociat cu fluxul
- StreamWriter(string path, bool append): parametrul append indică dacă datele trebuie adăugate la sfârșitul fișierului sau dacă fișierul trebuie rescris. Dacă valoarea este true, noile date sunt adăugate la sfârșitul fișierului. Dacă valoarea este false, fișierul este rescris de la început
- StreamWriter(string path, bool append, System.Text.Encoding encoding): parametrul encoding specifică codificarea care va fi utilizată la scriere
Funcționalitatea clasei StreamWriter este implementată prin următoarele metode:
- int Close(): închide fișierul în care s-a scris și eliberează toate resursele
- void Flush(): scrie în fișier datele rămase în buffer și golește bufferul
- Task FlushAsync(): versiunea asincronă a metodei Flush
- void Write(string value): scrie în fișier datele de tipuri simple, cum ar fi int, double, char, string etc. Are mai multe versiuni supraîncărcate pentru scrierea datelor de tipuri elementare, de exemplu, Write(char value), Write(int value), Write(double value) etc
- Task WriteAsync(string value): versiunea asincronă a metodei Write. Rețineți că versiunile asincrone nu sunt disponibile pentru toate supraîncărcările metodei Write
- void WriteLine(string value): scrie, de asemenea, datele, dar adaugă la finalul scrierii un simbol de terminare a liniei
- Task WriteLineAsync(string value): versiunea asincronă a metodei WriteLine
Să vedem un exemplu de scriere într-un fișier:
string path = "note1.txt";
string text = "Hello World\nHello FDC.COM";
// rescrierea completă a fișierului
using (StreamWriter writer = new StreamWriter(path, false))
{
await writer.WriteLineAsync(text);
}
// adăugarea în fișier
using (StreamWriter writer = new StreamWriter(path, true))
{
await writer.WriteLineAsync("Addition");
await writer.WriteAsync("4,5");
}
În acest exemplu, creăm de două ori obiectul StreamWriter. În primul caz, dacă fișierul există, acesta va fi rescris. Dacă nu există, va fi creat. Și în el va fi scris textul din variabila text. În al doilea caz, fișierul este deschis pentru adăugare, iar în el vor fi scrise date atomice - un șir de caractere și un număr.
După finalizare, în folderul programului vom găsi fișierul note.txt, care va conține următoarele linii:
Hello World
Hello FDC.COM
Addition
4,5
În exemplul de mai sus, se va folosi codificarea implicită, dar aceasta poate fi setată explicit:
using (StreamWriter writer = new StreamWriter(path, true, System.Text.Encoding.Default))
{
// operațiuni cu writer
}
Citirea din fișier cu StreamReader
Clasa StreamReader ne permite să citim cu ușurință tot textul sau linii individuale dintr-un fișier text.
Câteva dintre constructorii clasei StreamReader sunt:
- StreamReader(string path): parametrul path specifică calea către fișierul care va fi citit
- StreamReader(string path, System.Text.Encoding encoding): parametrul encoding specifică codificarea pentru citirea fișierului
Dintre metodele clasei StreamReader se remarcă următoarele:
- void Close(): închide fișierul citit și eliberează toate resursele
- int Peek(): returnează următorul caracter disponibil; dacă nu mai sunt caractere, returnează -1
- int Read(): citește și returnează următorul caracter în reprezentare numerică. Are o versiune supraîncărcată: Read(char[] array, int index, int count), unde array este array-ul în care sunt citite caracterele, index este indexul în array-ul array de la care sunt plasate caracterele citite, iar count este numărul maxim de caractere citite
- Task<int> ReadAsync(): versiunea asincronă a metodei Read
- string ReadLine(): citește o linie din fișier
- string ReadLineAsync(): versiunea asincronă a metodei ReadLine
- string ReadToEnd(): citește întregul text din fișier
- string ReadToEndAsync(): versiunea asincronă a metodei ReadToEnd
Mai întâi, să citim complet textul din fișierul scris anterior:
string path = "note1.txt";
// citire asincronă
using (StreamReader reader = new StreamReader(path))
{
string text = await reader.ReadToEndAsync();
Console.WriteLine(text);
}
Să citim textul din fișier linie cu linie:
string path = "note1.txt";
// citire asincronă
using (StreamReader reader = new StreamReader(path))
{
string? line;
while ((line = await reader.ReadLineAsync()) != null)
{
Console.WriteLine(line);
}
}
În acest caz, citim linie cu linie prin intermediul unui ciclu while: while ((line = await reader.ReadLineAsync()) != null) - mai întâi, atribuim variabilei line rezultatul funcției reader.ReadLineAsync(), iar apoi verificăm dacă nu este null. Când obiectul reader ajunge la sfârșitul fișierului și nu mai sunt linii rămase, metoda reader.ReadLineAsync() va returna null.