deleteFile static method

Future<void> deleteFile(
  1. String archivePath, {
  2. required String filename,
})

Implementation

static Future<void> deleteFile(
  String archivePath, {
  required String filename,
}) async {
  final header = await readHeader(archivePath);
  final oldFile = File(archivePath);
  final tempFile = File('.$archivePath.tmp');
  final sink = tempFile.openWrite();

  // --- Write Header ---
  sink.add(utf8.encode(header.mime));
  sink.add([header.version]);
  sink.add([header.flags]);

  if (header.coverImage != null) {
    final coverSize = ByteData(4)..setUint32(0, header.coverImage!.length);
    sink.add(coverSize.buffer.asUint8List());
    sink.add(header.coverImage!);
  }

  final configBytes = utf8.encode(jsonEncode(header.config));
  final configSize = ByteData(4)..setUint32(0, configBytes.length);
  sink.add(configSize.buffer.asUint8List());
  sink.add(configBytes);

  // --- Prepare Index + Data ---
  final indexBuilder = BytesBuilder();
  int currentOffset = 0;

  final updatedFiles = <TFileEntryInfo>[];

  for (final entry in header.files) {
    if (entry.name == filename) {
      continue; // skip this one = delete
    }

    final data = await entry.readFileData();

    // Build index
    final nameBytes = utf8.encode(entry.name);
    final nameLen = ByteData(2)..setUint16(0, nameBytes.length);
    final offsetBytes = ByteData(8)..setInt64(0, currentOffset);
    final lengthBytes = ByteData(8)..setInt64(0, data.length);

    indexBuilder.add(nameLen.buffer.asUint8List());
    indexBuilder.add(nameBytes);
    indexBuilder.add(offsetBytes.buffer.asUint8List());
    indexBuilder.add(lengthBytes.buffer.asUint8List());

    // updatedFiles.add(FileEntryInfo(entry.name, currentOffset, data.length));
    updatedFiles.add(
      TFileEntryInfo(
        path: entry.path,
        name: entry.name,
        length: entry.length,
        offset: entry.offset,
      ),
    );
    currentOffset += data.length;
  }

  // Write index section
  final indexBytes = indexBuilder.toBytes();
  final indexSize = ByteData(4)..setUint32(0, indexBytes.length);
  sink.add(indexSize.buffer.asUint8List());
  sink.add(indexBytes);

  // Write file data
  for (final file in updatedFiles) {
    // final data = await readFileData(archivePath, file.offset, file.length);
    final data = await file.readFileData();
    sink.add(data);
  }

  await sink.flush();
  await sink.close();

  await oldFile.delete();
  await tempFile.rename(archivePath);
}