Directory.list în Dart

Listează fișierele și subdirectoarele unui director; cu recursive: true intră și în subdirectoare.

Sintaxă
Stream<FileSystemEntity> list({bool recursive = false, bool followLinks = true})
List<FileSystemEntity> listSync({bool recursive = false, bool followLinks = true})

Ce face Directory.list

list() returnează un Stream<FileSystemEntity>: câte un element pentru fiecare fișier (File), director (Directory) sau link (Link) din director. Îl parcurgi cu await for sau îl strângi într-o listă cu .toList(). listSync() returnează direct o List.

Cu recursive: true se listează și conținutul tuturor subdirectoarelor. Cu is File / is Directory afli tipul fiecărui element.

Ordinea nu este garantată: depinde de sistemul de operare. Sortează după path dacă ai nevoie de o ordine anume.

Parametri

Parametru Descriere
recursive true listează și subdirectoarele, în adâncime.
followLinks Dacă linkurile simbolice sunt urmate (implicit true).

Ce returnează

Elementele directorului: Stream (asincron) sau List (Sync).

Exemple

Exemplul 1: Conținutul unui director, sortat

import 'dart:io';

Future<void> main() async {
  final d = Directory('proiect');
  await Directory('proiect/imagini').create(recursive: true);
  for (final nume in ['README.md', 'main.dart', 'imagini/logo.png']) {
    await File('proiect/$nume').writeAsString('...');
  }

  final elemente = await d.list().toList();
  elemente.sort((a, b) => a.path.compareTo(b.path));
  for (final e in elemente) {
    print('${e is Directory ? '[dir] ' : '      '}${e.path}');
  }
}

Rezultat

      proiect/README.md
[dir] proiect/imagini
      proiect/main.dart

Exemplul 2: Toate fișierele .txt, recursiv

import 'dart:io';

void main() {
  for (final cale in ['teme/mate/t1.txt', 'teme/mate/t2.pdf', 'teme/romana/eseu.txt', 'teme/note.txt']) {
    File(cale).createSync(recursive: true);
  }
  final txt = Directory('teme')
      .listSync(recursive: true)
      .whereType<File>()
      .where((f) => f.path.endsWith('.txt'))
      .map((f) => f.path)
      .toList()
    ..sort();
  print(txt.join('\n'));
  print('${txt.length} fișiere .txt');
}

Rezultat

teme/mate/t1.txt
teme/note.txt
teme/romana/eseu.txt
3 fișiere .txt

Exemplul 3: Mărimea totală a unui director

import 'dart:io';

Future<void> main() async {
  await Directory('muzica').create();
  await File('muzica/a.mp3').writeAsBytes(List.filled(1500, 0));
  await File('muzica/b.mp3').writeAsBytes(List.filled(2500, 0));

  var total = 0;
  await for (final e in Directory('muzica').list()) {
    if (e is File) total += await e.length();
  }
  print('Total: $total octeți');
}

Rezultat

Total: 4000 octeți

Greșeli frecvente

  • Te bazezi pe ordinea din list(). Pe alt sistem sau după alte operații, ordinea poate fi alta; sortează.
  • Folosești listSync(recursive: true) pe un director imens (de exemplu rădăcina discului): programul se blochează mult timp.

Comenzi înrudite

  • Directory: Clasa Directory reprezintă un director (folder) de pe disc: îl creezi, îl listezi, verifici dacă există, îl ștergi.
  • FileSystemEntity: Clasa de bază comună pentru File, Directory și Link; are path, uri, parent, exists, delete, rename, stat.
  • FileSystemEntity.isFile: Metode statice care spun ce se află la o cale: fișier, director, link sau nimic.