Files, I/O and Processes

Synchronous variants (readAsStringSync, existsSync) are available but block the event loop. Use them for simple scripts only.

The path package (p.join, p.basename, p.extension) handles cross-platform paths. The watcher package watches files.

Signals: ProcessSignal.sigint.watch().listen((_) => cleanup()).

import 'dart:io';
import 'dart:convert';

Future<void> main() async {
  final file = File('notes.txt');

  await file.writeAsString('Hello\n');                          // write (overwrite)
  await file.writeAsString('More\n', mode: FileMode.append);
  final content = await file.readAsString();
  final lines = await file.readAsLines();
  final bytes = await file.readAsBytes();
  print((await file.exists(), await file.length(), file.path));

  final sink = file.openWrite(mode: FileMode.append);          // efficient streaming writes
  sink.writeln('Streamed line');
  await sink.flush();
  await sink.close();

  await for (final line in file.openRead().transform(utf8.decoder).transform(const LineSplitter())) {
    print(line);                                                // stream large files line by line
  }

  final dir = Directory('output');
  await dir.create(recursive: true);
  await for (final entity in Directory.current.list(recursive: false)) {
    print('${entity is File ? 'F' : 'D'} ${entity.path}');
  }
  await File('notes.txt').copy('output/notes_copy.txt');
  await File('output/notes_copy.txt').rename('output/renamed.txt');
  await dir.delete(recursive: true);

  final
…