backup function
- String to
Backups everything in localPath as a zip, providing a progress stream.
Implementation
Stream<BackupProgress> backup(String to) async* {
final encoder = ZipFileEncoder();
encoder.create(to);
try {
final directory = Directory(await localPath);
final entities = directory.listSync(recursive: true);
final totalSize = entities.whereType<File>().fold<int>(
0,
(sum, file) => sum + file.lengthSync(),
);
int processedSize = 0;
DateTime startTime = DateTime.now();
for (final entity in entities) {
if (entity is File) {
final relativePath = entity.path.replaceFirst(directory.path, '');
encoder.addFile(entity, relativePath);
processedSize += entity.lengthSync();
// Berechne ETA
final elapsed = DateTime.now().difference(startTime).inMilliseconds;
final speed = processedSize / elapsed;
final remaining = totalSize - processedSize;
var etaMs = remaining / speed;
if (etaMs.isInfinite || etaMs.isNaN) {
etaMs =
0; // Skip if ETA calculation is invalid
}
final etaDuration = Duration(milliseconds: etaMs.round());
final etaStr = etaDuration.inMinutes >= 1
? '${etaDuration.inMinutes} min'
: '${etaDuration.inSeconds} s';
yield BackupProgress(
progress: processedSize / totalSize,
currentFile: relativePath,
eta: etaStr,
);
}
}
} finally {
encoder.close();
}
}