File.writeAsString în Dart

Scrie un text într-un fișier: îl creează dacă nu există și îl suprascrie; cu mode: FileMode.append adaugă la final.

Sintaxă
Future<File> writeAsString(String contents, {FileMode mode = FileMode.write, Encoding encoding = utf8, bool flush = false})
void writeAsStringSync(String contents, {FileMode mode = FileMode.write, Encoding encoding = utf8, bool flush = false})

Ce face File.writeAsString

writeAsString(text) scrie textul în fișier, codificat implicit în UTF-8. Dacă fișierul nu există, este creat; dacă există, conținutul vechi este înlocuit. Directorul în care se află fișierul trebuie să existe deja.

Cu mode: FileMode.append textul se adaugă la sfârșitul fișierului (vezi FileMode). Cu flush: true, datele sunt trimise pe disc înainte ca Future-ul să se termine.

writeAsString returnează un Future<File> (același fișier), deci se folosește cu await. writeAsStringSync nu returnează nimic și blochează până termină.

Parametri

Parametru Descriere
contents Textul de scris.
mode FileMode.write (implicit, suprascrie) sau FileMode.append (adaugă).
encoding Codificarea; implicit utf8.
flush true forțează scrierea pe disc înainte de a termina.

Ce returnează

Future<File> (asincron) sau nimic (Sync).

Exemple

Exemplul 1: Suprascriere și adăugare

import 'dart:io';

Future<void> main() async {
  final f = File('vizitatori.txt');
  await f.writeAsString('Ana\n');
  await f.writeAsString('Mihai\n');
  print(await f.readAsString());

  await f.writeAsString('Ioana\n', mode: FileMode.append);
  await f.writeAsString('Radu\n', mode: FileMode.append);
  print(await f.readAsString());
}

Rezultat

Mihai

Mihai
Ioana
Radu

Exemplul 2: Un raport generat, varianta sincronă

import 'dart:io';

void main() {
  final vanzari = {'Iași': 1200, 'Cluj': 950, 'Timișoara': 780};
  final raport = StringBuffer('Raport vânzări\n');
  vanzari.forEach((oras, lei) => raport.writeln('$oras: $lei lei'));
  File('raport.txt').writeAsStringSync(raport.toString());

  print(File('raport.txt').readAsStringSync());
}

Rezultat

Raport vânzări
Iași: 1200 lei
Cluj: 950 lei
Timișoara: 780 lei

Exemplul 3: Directorul trebuie să existe

import 'dart:io';

void main() {
  try {
    File('exporturi/date.txt').writeAsStringSync('test');
  } on FileSystemException catch (eroare) {
    print('Eroare: ${eroare.message}');
  }
  Directory('exporturi').createSync();
  File('exporturi/date.txt').writeAsStringSync('test');
  print(File('exporturi/date.txt').existsSync());
}

Rezultat

Eroare: Cannot open file
true

Greșeli frecvente

  • Apelezi writeAsString de mai multe ori ca să adaugi rânduri și rămâne doar ultimul. Fără mode: FileMode.append, fiecare apel suprascrie.
  • Nu aștepți (await) scrierea și citești imediat fișierul: poate fi încă gol.
  • Scrii într-un director care nu există și primești PathNotFoundException. Creează-l cu Directory(...).create(recursive: true).

Comenzi înrudite

  • File.readAsString: Citește tot conținutul unui fișier text într-un String (implicit UTF-8); varianta Sync blochează până termină.
  • FileMode: Modul în care se deschide un fișier: read (doar citire), write (golește și scrie), append (adaugă la final).
  • File.openWrite: Deschide fișierul pentru scriere și returnează un IOSink în care scrii pe bucăți; trebuie închis cu close().
  • Directory.create: create face un director nou (și părinții lui, cu recursive: true); delete șterge directorul, cu tot conținutul dacă e recursiv.