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
…