backup function

Stream<BackupProgress> backup(
  1. 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();
  }
}