export method
void
export(
- File target
)
Implementation
void export(File target) {
final files = <_BundleFile>[];
final dirs = <String>[];
for (final dir in assetDirs) {
if (!dir.existsSync()) {
throw Exception('Assets directory ${dir.path} does not exist');
}
for (final entity in dir.listSync(recursive: true, followLinks: false)) {
final relative = _relative(dir.path, entity.path);
if (relative.isEmpty) continue;
if (entity is File) {
files.add(_BundleFile(relative, entity));
} else if (entity is Directory) {
dirs.add(relative);
}
}
}
files.sort((a, b) => a.path.compareTo(b.path));
dirs.sort();
final body = BytesBuilder();
final digestInput = BytesBuilder();
for (final dir in dirs) {
final name = _cstring(dir);
body.add(_u32(name.length));
body.add(name);
digestInput.add(name);
}
for (final file in files) {
final name = _cstring(file.path);
final content = file.file.readAsBytesSync();
body.add(_u32(name.length));
body.add(name);
body.add(_u32(content.length));
body.add(content);
digestInput.add(name);
digestInput.add(content);
}
final signature = md5.convert(digestInput.takeBytes()).bytes;
final out = BytesBuilder();
out.add(_u32(magic));
out.add(_u32(version));
out.add(_u32(dirs.length));
out.add(_u32(files.length));
out.add(_u32(signature.length));
out.add(signature);
out.add(body.takeBytes());
target.parent.createSync(recursive: true);
target.writeAsBytesSync(out.takeBytes());
}