File.ReadAllText / WriteAllTextAsync în C# (.NET)

.NET BCL și CLI-ul dotnet .NET 2.0+ (metodele Async în .NET Core 2.0+)

Citește și scrie fișiere text sau linii pe disc (sincron și asincron) și construiește căi multi-platformă cu Path.Combine.

Sintaxă C#
string continut = await File.ReadAllTextAsync(cale, ct); | await File.WriteAllTextAsync(cale, text, ct);

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 întotdeauna Path.Combine(director, fisier).
  • Folosirea File.ReadAllLines sau File.ReadAllText pe fișiere de sute de megabiți, riscând OutOfMemoryException; folosește File.ReadLines sau StreamReader pentru 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ă.