Ce face File.ReadAllText / WriteAllTextAsync
Clasa statică System.IO.File oferă metode directe, de o singură linie, pentru cele mai frecvente operațiuni cu fișiere (citire, scriere, adăugare la final, verificare existență, copiere și ștergere), gestionând automat deschiderea și închiderea fluxului FileStream în fundal (inclusiv codificarea UTF-8 implicită). Atât variantele sincrone (ReadAllText, WriteAllText), cât și cele asincrone (ReadAllTextAsync, WriteAllTextAsync) sunt disponibile nativ.
Atunci când lucrezi cu fișiere foarte mari (de sute de megabiți sau gigabiți, cum sunt jurnalele de server), evită File.ReadAllLines (care încarcă toate liniile simultan într-un tablou string[] în memorie) și folosește File.ReadLines(cale) sau File.ReadLinesAsync(cale): acestea returnează un iterator leneș (IEnumerable<string> / IAsyncEnumerable<string>) care citește câte o singură linie pe rând. Pentru construirea căilor compatibile atât cu Windows (\), cât și cu Linux/macOS (/), folosește întotdeauna Path.Combine(...).
Parametri, metode și opțiuni
| Parametru / Metodă | Descriere |
|---|---|
File.ReadAllText(path) / ReadAllTextAsync |
Deschide fișierul, citește tot conținutul ca un singur string UTF-8 și închide fișierul. |
File.WriteAllText(path, contents) / Async |
Creează un fișier nou (sau îl suprascrie complet dacă există), scrie textul și închide fișierul. |
File.AppendAllText(path, contents) / Async |
Adaugă textul la sfârșitul fișierului (sau creează fișierul dacă nu există încă). |
File.ReadLines(path) / ReadLinesAsync(path) |
Citește fișierul linie cu linie în mod leneș (streaming), fără a încărca tot fișierul în RAM. |
File.Exists(path) / Directory.CreateDirectory |
Verifică dacă fișierul există pe disc, respectiv creează recursiv toate directoarele din cale dacă lipsesc. |
Path.Combine(p1, p2, ...) / Path.GetExtension |
Îmbină segmente de cale folosind separatorul sistemului de operare curent și extrage extensia fișierului. |
Exemple
Exemplul 1: Scriere și citire asincronă cu Path.Combine și File.WriteAllTextAsync
Construim o cale portabilă în directorul temporar, scriem asincron un fișier de configurare, adăugăm o linie nouă și apoi îl citim.
string directorTemp = Path.Combine(Path.GetTempPath(), "dexblog_demo");
Directory.CreateDirectory(directorTemp);
string caleFisier = Path.Combine(directorTemp, "app.log");
await File.WriteAllTextAsync(caleFisier, "[2026-10-23 10:00] Aplicația a pornit.\n");
await File.AppendAllTextAsync(caleFisier, "[2026-10-23 10:01] Conexiune DB stabilită.\n");
if (File.Exists(caleFisier))
{
string continut = await File.ReadAllTextAsync(caleFisier);
Console.Write(continut);
Console.WriteLine($"Extensie: {Path.GetExtension(caleFisier)} | Nume: {Path.GetFileName(caleFisier)}");
}
File.Delete(caleFisier);
Ieșire în consolă
[2026-10-23 10:00] Aplicația a pornit.
[2026-10-23 10:01] Conexiune DB stabilită.
Extensie: .log | Nume: app.log
Exemplul 2: Filtrarea unui fișier mare linie cu linie cu File.ReadLines și LINQ
Combinăm File.ReadLines (care citește în streaming) cu LINQ pentru a extrage doar liniile de eroare fără a consuma memorie suplimentară.
string caleLog = Path.Combine(Path.GetTempPath(), "server_events.log");
File.WriteAllLines(caleLog, [
"INFO: Server pornit pe portul 5000",
"ERROR: Timeout la apelul serviciului de facturare",
"INFO: Utilizator autentificat #42",
"ERROR: Certificat TLS expirat pentru webhook"
]);
var erori = File.ReadLines(caleLog)
.Where(linie => linie.StartsWith("ERROR:", StringComparison.Ordinal));
foreach (string eroare in erori)
{
Console.WriteLine(eroare);
}
File.Delete(caleLog);
Ieșire în consolă
ERROR: Timeout la apelul serviciului de facturare
ERROR: Certificat TLS expirat pentru webhook
Greșeli frecvente
- Concatenarea manuală a căilor cu
director + "\" + fisier, ceea ce eșuează pe Linux și macOS (unde separatorul de directoare este/); folosește întotdeaunaPath.Combine(director, fisier). - Folosirea
File.ReadAllLinessauFile.ReadAllTextpe fișiere de sute de megabiți, riscândOutOfMemoryException; foloseșteFile.ReadLinessauStreamReaderpentru procesarea în flux.
Funcții și concepte înrudite
async / await și Task<T>: Execută operațiuni I/O neblocante (rețea, baze de date, fișiere) și coordonează sarcini concurente cu Task și Task.WhenAll.try / catch și using (IDisposable): Gestionează controlat excepțiile la rulare și eliberează garantat resursele externe (fișiere, conexiuni, stream-uri) prin IDisposable.JsonSerializer (System.Text.Json): Serializează obiecte C# în format JSON și deserializează text JSON înapoi în tipuri puternic tipizate, cu performanță nativă ridicată.