private static async Task <PackageArchiveMetadata> CreateArchiveAsync(string id, string version, params ZipEntry[] files) { using (var zipArchiveStream = new MemoryStream()) { using (var zipArchive = new ZipArchive(zipArchiveStream, ZipArchiveMode.Create, leaveOpen: true)) { foreach (var file in files) { var entry = zipArchive.CreateEntry(file.Name, file.CompressionLevel); if (file.ExternalAttributes.HasValue) { entry.ExternalAttributes = file.ExternalAttributes.Value; } if (file.LastWriteTime.HasValue) { entry.LastWriteTime = file.LastWriteTime.Value; } using (var sourceStream = new MemoryStream(Encoding.UTF8.GetBytes(file.Contents))) using (var destinationStream = entry.Open()) { sourceStream.CopyTo(destinationStream); } } } zipArchiveStream.Position = 0; using (var reader = new ZipDirectoryReader(zipArchiveStream)) { var zipDirectory = await reader.ReadAsync(); return(new PackageArchiveMetadata { Id = id, Version = version, Size = zipArchiveStream.Length, ZipDirectory = zipDirectory, }); } } }
private async Task <PackageArchiveMetadata> InitializeItemAsync(PackageEntity package, CancellationToken token) { // Read the .zip directory. ZipDirectory zipDirectory; long size; using (var stream = await _mZipStore.GetMZipStreamOrNullAsync( package.PackageRegistration.Id, package.Version, token)) { if (stream == null) { if (!package.CatalogPackage.Deleted) { throw new InvalidOperationException($"Could not find .mzip for {package.PackageRegistration.Id} {package.Version}."); } return(null); } using (var reader = new ZipDirectoryReader(stream)) { zipDirectory = await reader.ReadAsync(); size = stream.Length; } } // Gather the metadata. var metadata = new PackageArchiveMetadata { Id = package.PackageRegistration.Id, Version = package.Version, Size = size, ZipDirectory = zipDirectory, }; return(metadata); }