From c440fdf88df30b4dc649b9e637f559654edfa7a9 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 30 Mar 2016 20:18:46 +0100 Subject: [PATCH 1/2] Give writers leaveOpen option --- SharpCompress.Test/WriterTests.cs | 14 +++++++++++--- SharpCompress/Writer/GZip/GZipWriter.cs | 5 ++--- SharpCompress/Writer/Tar/TarWriter.cs | 6 +++--- SharpCompress/Writer/WriterFactory.cs | 12 ++++++------ SharpCompress/Writer/Zip/ZipWriter.cs | 4 ++-- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/SharpCompress.Test/WriterTests.cs b/SharpCompress.Test/WriterTests.cs index 5efd9dc4..9fd01eb8 100644 --- a/SharpCompress.Test/WriterTests.cs +++ b/SharpCompress.Test/WriterTests.cs @@ -1,5 +1,7 @@ -using System.IO; +using System; +using System.IO; using SharpCompress.Common; +using SharpCompress.IO; using SharpCompress.Reader; using SharpCompress.Writer; @@ -18,9 +20,15 @@ namespace SharpCompress.Test { ResetScratch(); using (Stream stream = File.OpenWrite(Path.Combine(SCRATCH2_FILES_PATH, archive))) - using (var writer = WriterFactory.Open(stream, type, compressionType)) { - writer.WriteAll(ORIGINAL_FILES_PATH, "*", SearchOption.AllDirectories); + using (var writer = WriterFactory.Open(stream, type, compressionType, true)) + { + writer.WriteAll(ORIGINAL_FILES_PATH, "*", SearchOption.AllDirectories); + } + if (!stream.CanWrite) + { + throw new InvalidOperationException(); + } } CompareArchivesByPath(Path.Combine(SCRATCH2_FILES_PATH, archive), Path.Combine(TEST_ARCHIVES_PATH, archiveToVerifyAgainst)); diff --git a/SharpCompress/Writer/GZip/GZipWriter.cs b/SharpCompress/Writer/GZip/GZipWriter.cs index a718aad1..3539db32 100644 --- a/SharpCompress/Writer/GZip/GZipWriter.cs +++ b/SharpCompress/Writer/GZip/GZipWriter.cs @@ -1,7 +1,6 @@ using System; using System.IO; using SharpCompress.Common; -using SharpCompress.Common.Tar.Headers; using SharpCompress.Compressor; using SharpCompress.Compressor.Deflate; @@ -11,10 +10,10 @@ namespace SharpCompress.Writer.GZip { private bool wroteToStream; - public GZipWriter(Stream destination) + public GZipWriter(Stream destination, bool leaveOpen = false) : base(ArchiveType.GZip) { - InitalizeStream(new GZipStream(destination, CompressionMode.Compress, true), true); + InitalizeStream(new GZipStream(destination, CompressionMode.Compress, leaveOpen), !leaveOpen); } protected override void Dispose(bool isDisposing) diff --git a/SharpCompress/Writer/Tar/TarWriter.cs b/SharpCompress/Writer/Tar/TarWriter.cs index 5c947cc9..dd907c27 100644 --- a/SharpCompress/Writer/Tar/TarWriter.cs +++ b/SharpCompress/Writer/Tar/TarWriter.cs @@ -10,7 +10,7 @@ namespace SharpCompress.Writer.Tar { public class TarWriter : AbstractWriter { - public TarWriter(Stream destination, CompressionInfo compressionInfo) + public TarWriter(Stream destination, CompressionInfo compressionInfo, bool leaveOpen = false) : base(ArchiveType.Tar) { if (!destination.CanWrite) @@ -23,12 +23,12 @@ namespace SharpCompress.Writer.Tar break; case CompressionType.BZip2: { - destination = new BZip2Stream(destination, CompressionMode.Compress, false); + destination = new BZip2Stream(destination, CompressionMode.Compress, leaveOpen); } break; case CompressionType.GZip: { - destination = new GZipStream(destination, CompressionMode.Compress, false); + destination = new GZipStream(destination, CompressionMode.Compress, leaveOpen); } break; default: diff --git a/SharpCompress/Writer/WriterFactory.cs b/SharpCompress/Writer/WriterFactory.cs index 7a17ec1c..e33dede8 100644 --- a/SharpCompress/Writer/WriterFactory.cs +++ b/SharpCompress/Writer/WriterFactory.cs @@ -9,15 +9,15 @@ namespace SharpCompress.Writer { public static class WriterFactory { - public static IWriter Open(Stream stream, ArchiveType archiveType, CompressionType compressionType) + public static IWriter Open(Stream stream, ArchiveType archiveType, CompressionType compressionType, bool leaveOpen = false) { return Open(stream, archiveType, new CompressionInfo { Type = compressionType - }); + }, leaveOpen); } - public static IWriter Open(Stream stream, ArchiveType archiveType, CompressionInfo compressionInfo) + public static IWriter Open(Stream stream, ArchiveType archiveType, CompressionInfo compressionInfo, bool leaveOpen = false) { switch (archiveType) { @@ -27,15 +27,15 @@ namespace SharpCompress.Writer { throw new InvalidFormatException("GZip archives only support GZip compression type."); } - return new GZipWriter(stream); + return new GZipWriter(stream, leaveOpen); } case ArchiveType.Zip: { - return new ZipWriter(stream, compressionInfo, null); + return new ZipWriter(stream, compressionInfo, null, leaveOpen); } case ArchiveType.Tar: { - return new TarWriter(stream, compressionInfo); + return new TarWriter(stream, compressionInfo, leaveOpen); } default: { diff --git a/SharpCompress/Writer/Zip/ZipWriter.cs b/SharpCompress/Writer/Zip/ZipWriter.cs index 1b4c929f..4b8aedf9 100644 --- a/SharpCompress/Writer/Zip/ZipWriter.cs +++ b/SharpCompress/Writer/Zip/ZipWriter.cs @@ -24,13 +24,13 @@ namespace SharpCompress.Writer.Zip private readonly string zipComment; private long streamPosition; - public ZipWriter(Stream destination, CompressionInfo compressionInfo, string zipComment) + public ZipWriter(Stream destination, CompressionInfo compressionInfo, string zipComment, bool leaveOpen = false) : base(ArchiveType.Zip) { this.zipComment = zipComment ?? string.Empty; this.zipCompressionInfo = new ZipCompressionInfo(compressionInfo); - InitalizeStream(destination, false); + InitalizeStream(destination, !leaveOpen); } protected override void Dispose(bool isDisposing) From 762381fac671b88b882aeca0f9634fa4352ea6ce Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Thu, 31 Mar 2016 08:54:23 +0100 Subject: [PATCH 2/2] Explicit finish for BZip2 writing --- SharpCompress/Compressor/BZip2/BZip2Stream.cs | 5 +++++ SharpCompress/Reader/ReaderFactory.cs | 2 +- SharpCompress/Writer/Tar/TarWriter.cs | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/SharpCompress/Compressor/BZip2/BZip2Stream.cs b/SharpCompress/Compressor/BZip2/BZip2Stream.cs index e56d1d80..21bcc423 100644 --- a/SharpCompress/Compressor/BZip2/BZip2Stream.cs +++ b/SharpCompress/Compressor/BZip2/BZip2Stream.cs @@ -27,6 +27,11 @@ namespace SharpCompress.Compressor.BZip2 this.stream = new CBZip2InputStream(stream, decompressContacted, leaveOpen); } } + + public void Finish() + { + (this.stream as CBZip2OutputStream)?.Finish(); + } protected override void Dispose(bool disposing) { diff --git a/SharpCompress/Reader/ReaderFactory.cs b/SharpCompress/Reader/ReaderFactory.cs index dbf1756b..e8e794a7 100644 --- a/SharpCompress/Reader/ReaderFactory.cs +++ b/SharpCompress/Reader/ReaderFactory.cs @@ -53,7 +53,7 @@ namespace SharpCompress.Reader if (BZip2Stream.IsBZip2(rewindableStream)) { rewindableStream.Rewind(false); - BZip2Stream testStream = new BZip2Stream(rewindableStream, CompressionMode.Decompress, false); + BZip2Stream testStream = new BZip2Stream(rewindableStream, CompressionMode.Decompress, true); if (TarArchive.IsTarFile(testStream)) { rewindableStream.Rewind(true); diff --git a/SharpCompress/Writer/Tar/TarWriter.cs b/SharpCompress/Writer/Tar/TarWriter.cs index dd907c27..9dd61dbb 100644 --- a/SharpCompress/Writer/Tar/TarWriter.cs +++ b/SharpCompress/Writer/Tar/TarWriter.cs @@ -36,7 +36,7 @@ namespace SharpCompress.Writer.Tar throw new InvalidFormatException("Tar does not support compression: " + compressionInfo.Type); } } - InitalizeStream(destination, false); + InitalizeStream(destination, !leaveOpen); } public override void Write(string filename, Stream source, DateTime? modificationTime) @@ -91,7 +91,7 @@ namespace SharpCompress.Writer.Tar { PadTo512(0, true); PadTo512(0, true); - OutputStream.Dispose(); // required when bzip2 compression is used + (OutputStream as BZip2Stream)?.Finish(); // required when bzip2 compression is used } base.Dispose(isDisposing); }