create async

This commit is contained in:
Adam Hathcock
2021-02-08 12:07:45 +00:00
parent ef3d4da286
commit d6fe729068
19 changed files with 101 additions and 63 deletions

View File

@@ -184,7 +184,7 @@ namespace SharpCompress.Archives.Tar
IAsyncEnumerable<TarArchiveEntry> newEntries,
CancellationToken cancellationToken = default)
{
await using var writer = new TarWriter(stream, new TarWriterOptions(options));
await using var writer = await TarWriter.CreateAsync(stream, new TarWriterOptions(options), cancellationToken);
await foreach (var entry in oldEntries.Concat(newEntries)
.Where(x => !x.IsDirectory)
.WithCancellation(cancellationToken))

View File

@@ -5,6 +5,8 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using SharpCompress.Compressors.LZMA;
using SharpCompress.Compressors.LZMA.Utilites;
using SharpCompress.IO;
@@ -783,7 +785,7 @@ namespace SharpCompress.Common.SevenZip
}
}
private List<byte[]> ReadAndDecodePackedStreams(long baseOffset, IPasswordProvider pass)
private async ValueTask<List<byte[]>> ReadAndDecodePackedStreams(long baseOffset, IPasswordProvider pass, CancellationToken cancellationToken)
{
#if DEBUG
Log.WriteLine("-- ReadAndDecodePackedStreams --");
@@ -815,8 +817,8 @@ namespace SharpCompress.Common.SevenZip
dataStartPos += packSize;
}
var outStream = DecoderStreamHelper.CreateDecoderStream(_stream, oldDataStartPos, myPackSizes,
folder, pass);
var outStream = await DecoderStreamHelper.CreateDecoderStream(_stream, oldDataStartPos, myPackSizes,
folder, pass, cancellationToken);
int unpackSize = checked((int)folder.GetUnpackSize());
byte[] data = new byte[unpackSize];
@@ -845,7 +847,7 @@ namespace SharpCompress.Common.SevenZip
}
}
private void ReadHeader(ArchiveDatabase db, IPasswordProvider getTextPassword)
private async ValueTask ReadHeader(ArchiveDatabase db, IPasswordProvider getTextPassword, CancellationToken cancellationToken)
{
#if DEBUG
Log.WriteLine("-- ReadHeader --");
@@ -864,7 +866,7 @@ namespace SharpCompress.Common.SevenZip
List<byte[]> dataVector = null;
if (type == BlockType.AdditionalStreamsInfo)
{
dataVector = ReadAndDecodePackedStreams(db._startPositionAfterHeader, getTextPassword);
dataVector = await ReadAndDecodePackedStreams(db._startPositionAfterHeader, getTextPassword, cancellationToken);
type = ReadId();
}

View File

@@ -10,7 +10,7 @@ using SharpCompress.Compressors.BZip2;
using SharpCompress.Compressors.Deflate;
using SharpCompress.Compressors.Deflate64;
using SharpCompress.Compressors.LZMA;
using SharpCompress.Compressors.PPMd;
//using SharpCompress.Compressors.PPMd;
using SharpCompress.IO;
namespace SharpCompress.Common.Zip
@@ -75,7 +75,7 @@ namespace SharpCompress.Common.Zip
}
case ZipCompressionMethod.BZip2:
{
return new BZip2Stream(stream, CompressionMode.Decompress, false);
return await BZip2Stream.CreateAsync(stream, CompressionMode.Decompress, false, cancellationToken);
}
case ZipCompressionMethod.LZMA:
{
@@ -93,11 +93,11 @@ namespace SharpCompress.Common.Zip
? -1
: (long)Header.UncompressedSize);
}
case ZipCompressionMethod.PPMd:
/* case ZipCompressionMethod.PPMd:
{
var props = await stream.ReadBytes(2, cancellationToken);
return new PpmdStream(new PpmdProperties(props), stream, false);
}
} */
case ZipCompressionMethod.WinzipAes:
{
ExtraData? data = Header.Extra.SingleOrDefault(x => x.Type == ExtraDataType.WinZipAes);

View File

@@ -1,5 +1,7 @@
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using SharpCompress.Common.SevenZip;
using SharpCompress.Compressors.LZMA.Utilites;
using SharpCompress.IO;
@@ -91,8 +93,9 @@ namespace SharpCompress.Compressors.LZMA
}
}
private static Stream CreateDecoderStream(Stream[] packStreams, long[] packSizes, Stream[] outStreams,
CFolder folderInfo, int coderIndex, IPasswordProvider pass)
private static async ValueTask<Stream> CreateDecoderStream(Stream[] packStreams, long[] packSizes, Stream[] outStreams,
CFolder folderInfo, int coderIndex, IPasswordProvider pass,
CancellationToken cancellationToken)
{
var coderInfo = folderInfo._coders[coderIndex];
if (coderInfo._numOutStreams != 1)
@@ -127,8 +130,8 @@ namespace SharpCompress.Compressors.LZMA
}
int otherCoderIndex = FindCoderIndexForOutStreamIndex(folderInfo, pairedOutIndex);
inStreams[i] = CreateDecoderStream(packStreams, packSizes, outStreams, folderInfo, otherCoderIndex,
pass);
inStreams[i] = await CreateDecoderStream(packStreams, packSizes, outStreams, folderInfo, otherCoderIndex,
pass, cancellationToken);
//inStreamSizes[i] = folderInfo.UnpackSizes[pairedOutIndex];
@@ -154,11 +157,11 @@ namespace SharpCompress.Compressors.LZMA
}
long unpackSize = folderInfo._unpackSizes[outStreamId];
return DecoderRegistry.CreateDecoderStream(coderInfo._methodId, inStreams, coderInfo._props, pass, unpackSize);
return await DecoderRegistry.CreateDecoderStream(coderInfo._methodId, inStreams, coderInfo._props, pass, unpackSize, cancellationToken);
}
internal static Stream CreateDecoderStream(Stream inStream, long startPos, long[] packSizes, CFolder folderInfo,
IPasswordProvider pass)
internal static async ValueTask<Stream> CreateDecoderStream(Stream inStream, long startPos, long[] packSizes, CFolder folderInfo,
IPasswordProvider pass, CancellationToken cancellationToken)
{
if (!folderInfo.CheckStructure())
{
@@ -176,7 +179,7 @@ namespace SharpCompress.Compressors.LZMA
int primaryCoderIndex, primaryOutStreamIndex;
FindPrimaryOutStreamIndex(folderInfo, out primaryCoderIndex, out primaryOutStreamIndex);
return CreateDecoderStream(inStreams, packSizes, outStreams, folderInfo, primaryCoderIndex, pass);
return await CreateDecoderStream(inStreams, packSizes, outStreams, folderInfo, primaryCoderIndex, pass, cancellationToken);
}
}
}

View File

@@ -1,12 +1,14 @@
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using SharpCompress.Common.SevenZip;
using SharpCompress.Compressors.BZip2;
using SharpCompress.Compressors.Deflate;
using SharpCompress.Compressors.Filters;
using SharpCompress.Compressors.LZMA.Utilites;
using SharpCompress.Compressors.PPMd;
//using SharpCompress.Compressors.PPMd;
namespace SharpCompress.Compressors.LZMA
{
@@ -22,8 +24,8 @@ namespace SharpCompress.Compressors.LZMA
private const uint K_DEFLATE = 0x040108;
private const uint K_B_ZIP2 = 0x040202;
internal static Stream CreateDecoderStream(CMethodId id, Stream[] inStreams, byte[] info, IPasswordProvider pass,
long limit)
internal static async ValueTask<Stream> CreateDecoderStream(CMethodId id, Stream[] inStreams, byte[] info, IPasswordProvider pass,
long limit, CancellationToken cancellationToken)
{
switch (id._id)
{
@@ -43,9 +45,9 @@ namespace SharpCompress.Compressors.LZMA
case K_BCJ2:
return new Bcj2DecoderStream(inStreams, info, limit);
case K_B_ZIP2:
return new BZip2Stream(inStreams.Single(), CompressionMode.Decompress, true);
case K_PPMD:
return new PpmdStream(new PpmdProperties(info), inStreams.Single(), false);
return await BZip2Stream.CreateAsync(inStreams.Single(), CompressionMode.Decompress, true, cancellationToken);
/*case K_PPMD:
return new PpmdStream(new PpmdProperties(info), inStreams.Single(), false);*/
case K_DEFLATE:
return new DeflateStream(inStreams.Single(), CompressionMode.Decompress);
default:

View File

@@ -81,7 +81,7 @@ namespace SharpCompress.Readers
}
if (entriesForCurrentReadStream is null)
{
var stream = RequestInitialStream();
var stream = await RequestInitialStream(cancellationToken);
if (stream is null || !stream.CanRead)
{
throw new MultipartStreamRequiredException("File is split into multiple archives: '"
@@ -103,9 +103,9 @@ namespace SharpCompress.Readers
return false;
}
protected virtual Stream RequestInitialStream()
protected virtual ValueTask<Stream> RequestInitialStream(CancellationToken cancellationToken)
{
return Volume.Stream;
return new(Volume.Stream);
}
protected abstract IAsyncEnumerable<TEntry> GetEntries(Stream stream, CancellationToken cancellationToken);

View File

@@ -60,7 +60,7 @@ namespace SharpCompress.Readers
if (await BZip2Stream.IsBZip2Async(rewindableStream, cancellationToken))
{
rewindableStream.Rewind(false);
BZip2Stream testStream = new(new NonDisposingStream(rewindableStream), CompressionMode.Decompress, false);
var testStream = await BZip2Stream.CreateAsync(new NonDisposingStream(rewindableStream), CompressionMode.Decompress, false, cancellationToken);
if (await TarArchive.IsTarFileAsync(testStream, cancellationToken))
{
rewindableStream.Rewind(true);

View File

@@ -29,14 +29,14 @@ namespace SharpCompress.Readers.Tar
public override TarVolume Volume { get; }
protected override Stream RequestInitialStream()
protected override async ValueTask<Stream> RequestInitialStream(CancellationToken cancellationToken)
{
var stream = base.RequestInitialStream();
var stream = await base.RequestInitialStream(cancellationToken);
switch (compressionType)
{
case CompressionType.BZip2:
{
return new BZip2Stream(stream, CompressionMode.Decompress, false);
return await BZip2Stream.CreateAsync(stream, CompressionMode.Decompress, false, cancellationToken);
}
case CompressionType.GZip:
{
@@ -91,7 +91,7 @@ namespace SharpCompress.Readers.Tar
if (await BZip2Stream.IsBZip2Async(rewindableStream, cancellationToken))
{
rewindableStream.Rewind(false);
BZip2Stream testStream = new(rewindableStream, CompressionMode.Decompress, false);
var testStream = await BZip2Stream.CreateAsync(rewindableStream, CompressionMode.Decompress, false, cancellationToken);
if (await TarArchive.IsTarFileAsync(testStream, cancellationToken))
{
rewindableStream.Rewind(true);

View File

@@ -39,15 +39,30 @@
<Compile Remove="Archives\SevenZip\**" />
<Compile Remove="Archives\Rar\**" />
<Compile Remove="Readers\Rar\**" />
<Compile Remove="Common\Rar\**" />
<Compile Remove="Common\SevenZip\ArchiveDatabase.cs" />
<Compile Remove="Common\SevenZip\ArchiveReader.cs" />
<Compile Remove="Common\SevenZip\CStreamSwitch.cs" />
<Compile Remove="Common\SevenZip\SevenZipEntry.cs" />
<Compile Remove="Common\SevenZip\SevenZipFilePart.cs" />
<Compile Remove="Common\SevenZip\SevenZipVolume.cs" />
<Compile Remove="Compressors\Rar\**" />
<Compile Remove="Compressors\PPMd\**" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Remove="Archives\SevenZip\**" />
<EmbeddedResource Remove="Readers\Rar\**" />
<EmbeddedResource Remove="Common\Rar\**" />
<EmbeddedResource Remove="Compressors\Rar\**" />
<EmbeddedResource Remove="Compressors\PPMd\**" />
</ItemGroup>
<ItemGroup>
<None Remove="Archives\SevenZip\**" />
<None Remove="Archives\Rar\**" />
<None Remove="Readers\Rar\**" />
<None Remove="Common\Rar\**" />
<None Remove="Compressors\Rar\**" />
<None Remove="Compressors\PPMd\**" />
</ItemGroup>
</Project>

View File

@@ -15,18 +15,23 @@ namespace SharpCompress.Writers.Tar
{
public class TarWriter : AbstractWriter
{
private readonly bool finalizeArchiveOnClose;
private bool finalizeArchiveOnClose;
public TarWriter(Stream destination, TarWriterOptions options)
private TarWriter(TarWriterOptions options)
: base(ArchiveType.Tar, options)
{
finalizeArchiveOnClose = options.FinalizeArchiveOnClose;
}
public static async ValueTask<TarWriter> CreateAsync(Stream destination, TarWriterOptions options, CancellationToken cancellationToken = default)
{
var tw = new TarWriter(options);
tw.finalizeArchiveOnClose = options.FinalizeArchiveOnClose;
if (!destination.CanWrite)
{
throw new ArgumentException("Tars require writable streams.");
}
if (WriterOptions.LeaveStreamOpen)
if (tw.WriterOptions.LeaveStreamOpen)
{
destination = new NonDisposingStream(destination);
}
@@ -36,7 +41,7 @@ namespace SharpCompress.Writers.Tar
break;
case CompressionType.BZip2:
{
destination = new BZip2Stream(destination, CompressionMode.Compress, false);
destination = await BZip2Stream.CreateAsync(destination, CompressionMode.Compress, false, cancellationToken);
}
break;
case CompressionType.GZip:
@@ -54,7 +59,8 @@ namespace SharpCompress.Writers.Tar
throw new InvalidFormatException("Tar does not support compression: " + options.CompressionType);
}
}
InitializeStream(destination);
tw.InitializeStream(destination);
return tw;
}
public override ValueTask WriteAsync(string filename, Stream source, DateTime? modificationTime, CancellationToken cancellationToken = default)
@@ -118,7 +124,7 @@ namespace SharpCompress.Writers.Tar
{
case BZip2Stream b:
{
b.Finish();
await b.FinishAsync(CancellationToken.None);
break;
}
case LZipStream l:

View File

@@ -1,5 +1,7 @@
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using SharpCompress.Common;
using SharpCompress.Writers.GZip;
using SharpCompress.Writers.Tar;
@@ -9,7 +11,7 @@ namespace SharpCompress.Writers
{
public static class WriterFactory
{
public static IWriter Open(Stream stream, ArchiveType archiveType, WriterOptions writerOptions)
public static async ValueTask<IWriter> OpenAsync(Stream stream, ArchiveType archiveType, WriterOptions writerOptions, CancellationToken cancellationToken = default)
{
switch (archiveType)
{
@@ -27,7 +29,7 @@ namespace SharpCompress.Writers
}
case ArchiveType.Tar:
{
return new TarWriter(stream, new TarWriterOptions(writerOptions));
return await TarWriter.CreateAsync(stream, new TarWriterOptions(writerOptions), cancellationToken);
}
default:
{

View File

@@ -13,7 +13,7 @@ using SharpCompress.Compressors;
using SharpCompress.Compressors.BZip2;
using SharpCompress.Compressors.Deflate;
using SharpCompress.Compressors.LZMA;
using SharpCompress.Compressors.PPMd;
//using SharpCompress.Compressors.PPMd;
using SharpCompress.IO;
namespace SharpCompress.Writers.Zip
@@ -25,7 +25,7 @@ namespace SharpCompress.Writers.Zip
private readonly List<ZipCentralDirectoryEntry> entries = new();
private readonly string zipComment;
private long streamPosition;
private PpmdProperties? ppmdProps;
// private PpmdProperties? ppmdProps;
private readonly bool isZip64;
public ZipWriter(Stream destination, ZipWriterOptions zipWriterOptions)
@@ -48,13 +48,13 @@ namespace SharpCompress.Writers.Zip
InitializeStream(destination);
}
private PpmdProperties PpmdProperties
/* private PpmdProperties PpmdProperties
{
get
{
return ppmdProps ??= new PpmdProperties();
}
}
} */
protected override async ValueTask DisposeAsyncCore()
{
@@ -132,8 +132,10 @@ namespace SharpCompress.Writers.Zip
var headersize = (uint)(await WriteHeaderAsync(entryPath, options, entry, useZip64, cancellationToken));
streamPosition += headersize;
return new ZipWritingStream(this, OutputStream, entry, compression,
var s = new ZipWritingStream(this, OutputStream, entry, compression,
options.DeflateCompressionLevel ?? compressionLevel);
await s.InitializeAsync(cancellationToken);
return s;
}
private string NormalizeFilename(string filename)
@@ -336,7 +338,9 @@ namespace SharpCompress.Writers.Zip
private readonly CRC32 crc = new CRC32();
private readonly ZipCentralDirectoryEntry entry;
private readonly Stream originalStream;
private readonly Stream writeStream;
#nullable disable
private Stream writeStream;
#nullable enable
private readonly ZipWriter writer;
private readonly ZipCompressionMethod zipCompressionMethod;
private readonly CompressionLevel compressionLevel;
@@ -356,7 +360,11 @@ namespace SharpCompress.Writers.Zip
this.entry = entry;
this.zipCompressionMethod = zipCompressionMethod;
this.compressionLevel = compressionLevel;
writeStream = GetWriteStream(originalStream);
}
public async ValueTask InitializeAsync(CancellationToken cancellationToken)
{
writeStream = await GetWriteStream(originalStream, cancellationToken);
}
public override bool CanRead => false;
@@ -369,7 +377,7 @@ namespace SharpCompress.Writers.Zip
public override long Position { get => throw new NotSupportedException(); set => throw new NotSupportedException(); }
private Stream GetWriteStream(Stream writeStream)
private async ValueTask<Stream> GetWriteStream(Stream writeStream, CancellationToken cancellationToken)
{
counting = new CountingWritableSubStream(writeStream);
Stream output = counting;
@@ -385,7 +393,7 @@ namespace SharpCompress.Writers.Zip
}
case ZipCompressionMethod.BZip2:
{
return new BZip2Stream(counting, CompressionMode.Compress, false);
return await BZip2Stream.CreateAsync(counting, CompressionMode.Compress, false, cancellationToken);
}
case ZipCompressionMethod.LZMA:
{
@@ -399,11 +407,11 @@ namespace SharpCompress.Writers.Zip
counting.Write(lzmaStream.Properties, 0, lzmaStream.Properties.Length);
return lzmaStream;
}
case ZipCompressionMethod.PPMd:
/* case ZipCompressionMethod.PPMd:
{
counting.Write(writer.PpmdProperties.Properties, 0, 2);
return new PpmdStream(writer.PpmdProperties, counting, true);
}
} */
default:
{
throw new NotSupportedException("CompressionMethod: " + zipCompressionMethod);

View File

@@ -19,7 +19,7 @@ namespace SharpCompress.Test.GZip
public async Task GZip_Writer_Generic()
{
await using (Stream stream = File.Open(Path.Combine(SCRATCH_FILES_PATH, "Tar.tar.gz"), FileMode.OpenOrCreate, FileAccess.Write))
await using (var writer = WriterFactory.Open(stream, ArchiveType.GZip, CompressionType.GZip))
await using (var writer = await WriterFactory.OpenAsync(stream, ArchiveType.GZip, CompressionType.GZip))
{
await writer.WriteAsync("Tar.tar", Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar"));
}
@@ -45,7 +45,7 @@ namespace SharpCompress.Test.GZip
await Assert.ThrowsAsync<InvalidFormatException>(async () =>
{
await using (Stream stream = File.OpenWrite(Path.Combine(SCRATCH_FILES_PATH, "Tar.tar.gz")))
await using (var writer = WriterFactory.Open(stream, ArchiveType.GZip, CompressionType.BZip2))
await using (var writer = await WriterFactory.OpenAsync(stream, ArchiveType.GZip, CompressionType.BZip2))
{
}
});

View File

@@ -44,7 +44,7 @@ namespace SharpCompress.Test.Tar
// Step 1: create a tar file containing a file with the test name
await using (Stream stream = File.OpenWrite(Path.Combine(SCRATCH2_FILES_PATH, archive)))
await using (var writer = WriterFactory.Open(stream, ArchiveType.Tar, CompressionType.None))
await using (var writer = await WriterFactory.OpenAsync(stream, ArchiveType.Tar, CompressionType.None))
await using (Stream inputStream = new MemoryStream())
{
StreamWriter sw = new StreamWriter(inputStream);
@@ -99,7 +99,7 @@ namespace SharpCompress.Test.Tar
// Step 1: create a tar file containing a file with a long name
await using (Stream stream = File.OpenWrite(Path.Combine(SCRATCH2_FILES_PATH, archive)))
await using (var writer = WriterFactory.Open(stream, ArchiveType.Tar, CompressionType.None))
await using (var writer = await WriterFactory.OpenAsync(stream, ArchiveType.Tar, CompressionType.None))
await using (Stream inputStream = new MemoryStream())
{
StreamWriter sw = new StreamWriter(inputStream);
@@ -220,7 +220,7 @@ namespace SharpCompress.Test.Tar
var twopt = new TarWriterOptions(CompressionType.None, true);
twopt.ArchiveEncoding = enc;
var fname = new string((char)0x3042, length);
await using (var tw = new TarWriter(mstm, twopt))
await using (var tw = await TarWriter.CreateAsync(mstm, twopt))
await using (var input = new MemoryStream(new byte[32]))
{
await tw.WriteAsync(fname, input, null);
@@ -250,7 +250,7 @@ namespace SharpCompress.Test.Tar
var testBytes = Encoding.UTF8.GetBytes("This is a test.");
await using var memoryStream = new MemoryStream();
await using (var tarWriter = new TarWriter(memoryStream, tarWriterOptions))
await using (var tarWriter = await TarWriter.CreateAsync(memoryStream, tarWriterOptions))
await using (var testFileStream = new MemoryStream(testBytes))
{
await tarWriter.WriteAsync("test1.txt", testFileStream);

View File

@@ -47,7 +47,7 @@ namespace SharpCompress.Test.Tar
using (MemoryStream stream = new MemoryStream())
using (Stream content = File.OpenRead(Path.Combine(ORIGINAL_FILES_PATH, "jpg", "test.jpg")))
{
await using (TarWriter writer = new TarWriter(stream, new TarWriterOptions(CompressionType.None, finalizeArchive)))
await using (TarWriter writer = await TarWriter.CreateAsync(stream, new TarWriterOptions(CompressionType.None, finalizeArchive)))
{
await writer.WriteAsync("doesn't matter", content, null);
}

View File

@@ -28,7 +28,7 @@ namespace SharpCompress.Test
writerOptions.ArchiveEncoding.Default = encoding ?? Encoding.Default;
await using (var writer = WriterFactory.Open(stream, type, writerOptions))
await using (var writer = await WriterFactory.OpenAsync(stream, type, writerOptions))
{
await writer.WriteAllAsync(ORIGINAL_FILES_PATH, "*", SearchOption.AllDirectories);
}

View File

@@ -149,7 +149,7 @@ namespace SharpCompress.Test.Zip
using (var zip = File.OpenWrite(filename))
using (var st = forward_only ? (Stream)new ForwardOnlyStream(zip) : zip)
await using (var zipWriter = (ZipWriter)WriterFactory.Open(st, ArchiveType.Zip, opts))
await using (var zipWriter = (ZipWriter)await WriterFactory.OpenAsync(st, ArchiveType.Zip, opts))
{
for (var i = 0; i < files; i++)

View File

@@ -488,7 +488,7 @@ namespace SharpCompress.Test.Zip
{
MemoryStream stream = new NonSeekableMemoryStream();
await using (IWriter zipWriter = WriterFactory.Open(stream, ArchiveType.Zip, CompressionType.Deflate))
await using (IWriter zipWriter = await WriterFactory.OpenAsync(stream, ArchiveType.Zip, CompressionType.Deflate))
{
await zipWriter.WriteAsync("foo.txt", new MemoryStream(new byte[0]));
await zipWriter.WriteAsync("foo2.txt", new MemoryStream(new byte[10]));

View File

@@ -284,7 +284,7 @@ namespace SharpCompress.Test.Zip
{
Stream stream = new TestStream(memory, read: true, write: true, seek: false);
await using (IWriter zipWriter = WriterFactory.Open(stream, ArchiveType.Zip, CompressionType.Deflate))
await using (IWriter zipWriter = await WriterFactory.OpenAsync(stream, ArchiveType.Zip, CompressionType.Deflate))
{
await zipWriter.WriteAsync(expected[0].Item1, new MemoryStream(expected[0].Item2));
await zipWriter.WriteAsync(expected[1].Item1, new MemoryStream(expected[1].Item2));