/// <inheritdoc /> protected override void CompressInternal(Stream source, Stream target) { if (source.CanSeek) { source.Position = 0; } string entryName = source.GetFileName() ?? "_"; ZipArchive archive = null; Stream entryStream = null; try { archive = new ZipArchive(target, CompressionMode.ToSystemCompressionMode(), true); ZipArchiveEntry entry = archive.CreateEntry(entryName, CompressionLevel.ToSystemCompressionLevel()); entry.LastWriteTime = DateTimeOffset.Now; entryStream = entry.Open(); source.CopyTo(entryStream); entryStream.Flush(); target.Flush(); } finally { ObjectHelper.Dispose(ref entryStream); ObjectHelper.Dispose(ref archive); } }
/// <inheritdoc /> protected override async Task CompressInternalAsync(Stream source, Stream target, CancellationToken token = default(CancellationToken)) { token.ThrowIfCancellationRequested(); if (source.CanSeek) { source.Position = 0; } string entryName = source.GetFileName() ?? "_"; ZipArchive archive = null; Stream entryStream = null; try { archive = new ZipArchive(target, CompressionMode.ToSystemCompressionMode(), true); ZipArchiveEntry entry = archive.CreateEntry(entryName, CompressionLevel.ToSystemCompressionLevel()); entry.LastWriteTime = DateTimeOffset.Now; entryStream = entry.Open(); await source.CopyToAsync(entryStream, Constants.BUFFER_16_KB, token); await entryStream.FlushAsync(token); await target.FlushAsync(token); } finally { ObjectHelper.Dispose(ref entryStream); ObjectHelper.Dispose(ref archive); } }
protected override Task CompressInternalAsync(string sourcePath, string destinationPath, CancellationToken token = default(CancellationToken)) { token.ThrowIfCancellationRequested(); sourcePath = PathHelper.Trim(sourcePath) ?? throw new ArgumentNullException(nameof(sourcePath)); destinationPath = PathHelper.Trim(destinationPath) ?? throw new ArgumentNullException(nameof(destinationPath)); if (!DirectoryHelper.Ensure(destinationPath)) { throw new DirectoryNotFoundException(); } token.ThrowIfCancellationRequested(); string fileName; string newPath; if (File.Exists(sourcePath)) { // compressing one file fileName = Path.GetFileNameWithoutExtension(sourcePath); newPath = Path.Combine(destinationPath, fileName + ".zip"); ZipArchive zip = null; try { zip = ZipFile.Open(newPath, CompressionMode.ToSystemCompressionMode(), Encoding.UTF8); token.ThrowIfCancellationRequested(); zip.CreateEntryFromFile(sourcePath, fileName, CompressionLevel.ToSystemCompressionLevel()); token.ThrowIfCancellationRequested(); } finally { ObjectHelper.Dispose(ref zip); } return(Task.CompletedTask); } if (!Directory.Exists(sourcePath)) { throw new NotFoundException("File or directory not found."); } fileName = Path.GetDirectoryName(sourcePath); newPath = Path.Combine(destinationPath, fileName + ".zip"); token.ThrowIfCancellationRequested(); ZipFile.CreateFromDirectory(sourcePath, newPath, CompressionLevel.ToSystemCompressionLevel(), PreserveDirectoryRoot, Encoding.UTF8); token.ThrowIfCancellationRequested(); return(Task.CompletedTask); }