diff --git a/SharpCompress/Common/EntryStream.cs b/SharpCompress/Common/EntryStream.cs
index a14bbbbb..86e50978 100644
--- a/SharpCompress/Common/EntryStream.cs
+++ b/SharpCompress/Common/EntryStream.cs
@@ -1,16 +1,19 @@
using System;
using System.IO;
+using SharpCompress.Reader;
namespace SharpCompress.Common
{
public class EntryStream : Stream
{
+ public IReader Reader { get; private set; }
private Stream stream;
private bool completed;
private bool isDisposed;
- internal EntryStream(Stream stream)
+ internal EntryStream(IReader reader, Stream stream)
{
+ this.Reader = reader;
this.stream = stream;
}
@@ -26,25 +29,9 @@ namespace SharpCompress.Common
completed = true;
}
- public bool Cancelled { get; private set; }
-
- ///
- /// Indicates that the remainder of the stream is not required.
- /// On dispose, the entry will not be skipped, so it helps with efficiency.
- /// The downside is that subsequent entries are not usable, as the compressed stream is not positioned at an entry boundary.
- ///
- public void Cancel()
- {
- if (!completed)
- {
- Cancelled = true;
- stream.Close();
- }
- }
-
protected override void Dispose(bool disposing)
{
- if (!(completed || Cancelled))
+ if (!(completed || Reader.Cancelled))
{
SkipEntry();
}
diff --git a/SharpCompress/Reader/AbstractReader.cs b/SharpCompress/Reader/AbstractReader.cs
index bd940ce8..699770a3 100644
--- a/SharpCompress/Reader/AbstractReader.cs
+++ b/SharpCompress/Reader/AbstractReader.cs
@@ -67,22 +67,36 @@ namespace SharpCompress.Reader
#endregion
+
+ public bool Cancelled { get; private set; }
+
+ ///
+ /// Indicates that the remaining entries are not required.
+ /// On dispose of an EntryStream, the stream will not skip to the end of the entry.
+ /// An attempt to move to the next entry will throw an exception, as the compressed stream is not positioned at an entry boundary.
+ ///
+ public void Cancel()
+ {
+ if (!completed)
+ {
+ Cancelled = true;
+ }
+ }
+
public bool MoveToNextEntry()
{
if (completed)
{
return false;
}
+ if (Cancelled)
+ {
+ throw new InvalidOperationException("Reader has been cancelled.");
+ }
if (entriesForCurrentReadStream == null)
{
return LoadStreamForReading(RequestInitialStream());
}
-
- if (currentEntryStream != null && currentEntryStream.Cancelled)
- {
- throw new InvalidOperationException("EntryStream has not been fully consumed. Read the entire stream or use SkipEntry.");
- }
-
if (!wroteCurrentEntry)
{
SkipEntry();
@@ -203,14 +217,12 @@ namespace SharpCompress.Reader
return stream;
}
- private EntryStream currentEntryStream;
-
///
/// Retains a reference to the entry stream, so we can check whether it completed later.
///
protected EntryStream CreateEntryStream(Stream decompressed)
{
- return currentEntryStream = new EntryStream(decompressed);
+ return new EntryStream(this, decompressed);
}
protected virtual EntryStream GetEntryStream()
diff --git a/SharpCompress/Reader/IReader.cs b/SharpCompress/Reader/IReader.cs
index 769c1741..cf26ea16 100644
--- a/SharpCompress/Reader/IReader.cs
+++ b/SharpCompress/Reader/IReader.cs
@@ -22,6 +22,9 @@ namespace SharpCompress.Reader
///
void WriteEntryTo(Stream writableStream);
+ bool Cancelled { get; }
+ void Cancel();
+
///
/// Moves to the next entry by reading more data from the underlying stream. This skips if data has not been read.
///