list method
All sessions in directory, sorted from oldest to newest (by last activity).
Implementation
Future<List<FileLogSession>> list() async {
final dir = Directory(directory);
if (!dir.existsSync()) return const [];
final chunksById =
<String, List<({int index, File file, FileStat stat})>>{};
await for (final entity in dir.list()) {
if (entity is! File) continue;
final parsed = parseChunkName(entity.uri.pathSegments.last);
if (parsed == null) continue;
final stat = entity.statSync();
// Файл могли удалить между list() и statSync (ротация/очистка другого
// процесса) — иначе сессия получит size -1 и lastModified около эпохи.
if (stat.type == FileSystemEntityType.notFound) continue;
chunksById
.putIfAbsent(parsed.sessionId, () => [])
.add((index: parsed.index, file: entity, stat: stat));
}
final sessions = <FileLogSession>[];
for (final MapEntry(key: id, value: chunks) in chunksById.entries) {
chunks.sort((a, b) => a.index.compareTo(b.index));
var size = 0;
var lastModified = DateTime.fromMillisecondsSinceEpoch(0);
for (final chunk in chunks) {
size += chunk.stat.size;
if (chunk.stat.modified.isAfter(lastModified)) {
lastModified = chunk.stat.modified;
}
}
sessions.add(
FileLogSession._(
id: id,
files: List.unmodifiable(chunks.map((c) => c.file)),
size: size,
lastModified: lastModified,
),
);
}
sessions.sort(
(a, b) => switch (a.lastModified.compareTo(b.lastModified)) {
0 => a.id.compareTo(b.id),
final byTime => byTime,
},
);
return sessions;
}