deleteFile static method
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);
}