diff --git a/SharpCompress.Test/Rar/RarArchiveTests.cs b/SharpCompress.Test/Rar/RarArchiveTests.cs
index de1baa89..5a713679 100644
--- a/SharpCompress.Test/Rar/RarArchiveTests.cs
+++ b/SharpCompress.Test/Rar/RarArchiveTests.cs
@@ -65,7 +65,7 @@ namespace SharpCompress.Test
{
using (var archive = RarArchive.Open(stream))
{
- Assert.IsFalse(archive.IsSolidArchive());
+ Assert.IsFalse(archive.IsSolid);
foreach (var entry in archive.Entries.Where(entry => !entry.IsDirectory))
{
entry.WriteToDirectory(SCRATCH_FILES_PATH,
@@ -132,7 +132,7 @@ namespace SharpCompress.Test
{
using (var archive = RarArchive.Open(stream))
{
- Assert.IsFalse(archive.IsSolidArchive());
+ Assert.IsFalse(archive.IsSolid);
Assert.IsTrue(archive.Entries.Any(entry => entry.IsDirectory));
}
}
diff --git a/SharpCompress/Archive/IArchiveEntry.Extensions.cs b/SharpCompress/Archive/IArchiveEntry.Extensions.cs
index 617ba5e1..7ad934c3 100644
--- a/SharpCompress/Archive/IArchiveEntry.Extensions.cs
+++ b/SharpCompress/Archive/IArchiveEntry.Extensions.cs
@@ -8,16 +8,11 @@ namespace SharpCompress.Archive
{
public static void WriteTo(this IArchiveEntry archiveEntry, Stream streamToWriteTo)
{
- if (archiveEntry.Archive.IsSolid)
+ if (archiveEntry.Archive.Type == ArchiveType.Rar && archiveEntry.Archive.IsSolid)
{
throw new InvalidFormatException("Cannot use Archive random access on SOLID Rar files.");
}
- if (archiveEntry.IsEncrypted)
- {
- throw new PasswordProtectedException("Entry is password protected and cannot be extracted.");
- }
-
if (archiveEntry.IsDirectory)
{
throw new ExtractionException("Entry is a file directory and cannot be extracted.");
diff --git a/SharpCompress/Archive/IArchiveEntry.cs b/SharpCompress/Archive/IArchiveEntry.cs
index 80f0488e..b9f04364 100644
--- a/SharpCompress/Archive/IArchiveEntry.cs
+++ b/SharpCompress/Archive/IArchiveEntry.cs
@@ -16,6 +16,9 @@ namespace SharpCompress.Archive
///
bool IsComplete { get; }
+ ///
+ /// The archive instance this entry belongs to
+ ///
IArchive Archive { get; }
}
}
\ No newline at end of file
diff --git a/SharpCompress/Archive/Rar/FileInfoRarArchiveVolume.cs b/SharpCompress/Archive/Rar/FileInfoRarArchiveVolume.cs
index 621f3591..754185e6 100644
--- a/SharpCompress/Archive/Rar/FileInfoRarArchiveVolume.cs
+++ b/SharpCompress/Archive/Rar/FileInfoRarArchiveVolume.cs
@@ -42,10 +42,5 @@ namespace SharpCompress.Archive.Rar
{
return FileParts;
}
-
- public override FileInfo VolumeFile
- {
- get { return FileInfo; }
- }
}
}
\ No newline at end of file
diff --git a/SharpCompress/Archive/Rar/FileInfoRarFilePart.cs b/SharpCompress/Archive/Rar/FileInfoRarFilePart.cs
index cea7d6a1..ea7bbf98 100644
--- a/SharpCompress/Archive/Rar/FileInfoRarFilePart.cs
+++ b/SharpCompress/Archive/Rar/FileInfoRarFilePart.cs
@@ -6,7 +6,7 @@ namespace SharpCompress.Archive.Rar
{
internal class FileInfoRarFilePart : RarFilePart
{
- private FileInfoRarArchiveVolume volume;
+ private readonly FileInfoRarArchiveVolume volume;
internal FileInfoRarFilePart(FileInfoRarArchiveVolume volume, MarkHeader mh, FileHeader fh, FileInfo fi)
: base(mh, fh)
diff --git a/SharpCompress/Archive/Rar/SeekableStreamFilePart.cs b/SharpCompress/Archive/Rar/SeekableStreamFilePart.cs
deleted file mode 100644
index 5b880644..00000000
--- a/SharpCompress/Archive/Rar/SeekableStreamFilePart.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System.IO;
-using SharpCompress.Common.Rar;
-using SharpCompress.Common.Rar.Headers;
-
-namespace SharpCompress.Archive.Rar
-{
- internal class SeekableStreamFilePart : RarFilePart
- {
- internal SeekableStreamFilePart(MarkHeader mh, FileHeader fh, Stream stream)
- : base(mh, fh)
- {
- Stream = stream;
- }
-
- internal Stream Stream { get; private set; }
-
- internal override Stream GetCompressedStream()
- {
- Stream.Position = FileHeader.DataStartPosition;
- return Stream;
- }
-
- internal override string FilePartName
- {
- get { return "Unknown Stream - File Entry: " + base.FileHeader.FileName; }
- }
- }
-}
\ No newline at end of file
diff --git a/SharpCompress/Archive/Rar/StreamFilePart.cs b/SharpCompress/Archive/Rar/StreamFilePart.cs
new file mode 100644
index 00000000..ee5d8543
--- /dev/null
+++ b/SharpCompress/Archive/Rar/StreamFilePart.cs
@@ -0,0 +1,27 @@
+using System.IO;
+using SharpCompress.Common.Rar;
+using SharpCompress.Common.Rar.Headers;
+
+namespace SharpCompress.Archive.Rar
+{
+ internal class StreamFilePart : RarFilePart
+ {
+ private readonly Stream stream;
+ internal StreamFilePart(MarkHeader mh, FileHeader fh, Stream stream)
+ : base(mh, fh)
+ {
+ this.stream = stream;
+ }
+
+ internal override Stream GetCompressedStream()
+ {
+ stream.Position = FileHeader.DataStartPosition;
+ return stream;
+ }
+
+ internal override string FilePartName
+ {
+ get { return "Unknown Stream - File Entry: " + FileHeader.FileName; }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SharpCompress/Archive/Rar/StreamRarArchiveVolume.cs b/SharpCompress/Archive/Rar/StreamRarArchiveVolume.cs
index 74f3606a..7f114634 100644
--- a/SharpCompress/Archive/Rar/StreamRarArchiveVolume.cs
+++ b/SharpCompress/Archive/Rar/StreamRarArchiveVolume.cs
@@ -14,13 +14,6 @@ namespace SharpCompress.Archive.Rar
{
}
-#if !PORTABLE && !NETFX_CORE
- public override FileInfo VolumeFile
- {
- get { return null; }
- }
-#endif
-
internal override IEnumerable ReadFileParts()
{
return GetVolumeFileParts();
@@ -28,7 +21,7 @@ namespace SharpCompress.Archive.Rar
internal override RarFilePart CreateFilePart(FileHeader fileHeader, MarkHeader markHeader)
{
- return new SeekableStreamFilePart(markHeader, fileHeader, Stream);
+ return new StreamFilePart(markHeader, fileHeader, Stream);
}
}
}
\ No newline at end of file
diff --git a/SharpCompress/Archive/SevenZip/SevenZipArchive.cs b/SharpCompress/Archive/SevenZip/SevenZipArchive.cs
index bee5a4ef..9a7bb0da 100644
--- a/SharpCompress/Archive/SevenZip/SevenZipArchive.cs
+++ b/SharpCompress/Archive/SevenZip/SevenZipArchive.cs
@@ -83,7 +83,11 @@ namespace SharpCompress.Archive.SevenZip
protected override IEnumerable LoadVolumes(FileInfo file, Options options)
{
- return new SevenZipVolume(file, options).AsEnumerable();
+ if (FlagUtility.HasFlag(options, Options.KeepStreamsOpen))
+ {
+ options = (Options)FlagUtility.SetFlag(options, Options.KeepStreamsOpen, false);
+ }
+ return new SevenZipVolume(file.OpenRead(), options).AsEnumerable();
}
public static bool IsSevenZipFile(string filePath)
diff --git a/SharpCompress/Archive/Tar/TarArchive.cs b/SharpCompress/Archive/Tar/TarArchive.cs
index e3e7b838..0fa86ccb 100644
--- a/SharpCompress/Archive/Tar/TarArchive.cs
+++ b/SharpCompress/Archive/Tar/TarArchive.cs
@@ -123,7 +123,11 @@ namespace SharpCompress.Archive.Tar
protected override IEnumerable LoadVolumes(FileInfo file, Options options)
{
- return new TarVolume(file, options).AsEnumerable();
+ if (FlagUtility.HasFlag(options, Options.KeepStreamsOpen))
+ {
+ options = (Options)FlagUtility.SetFlag(options, Options.KeepStreamsOpen, false);
+ }
+ return new TarVolume(file.OpenRead(), options).AsEnumerable();
}
#endif
diff --git a/SharpCompress/Archive/Zip/ZipArchive.cs b/SharpCompress/Archive/Zip/ZipArchive.cs
index ee5e2f29..e309a551 100644
--- a/SharpCompress/Archive/Zip/ZipArchive.cs
+++ b/SharpCompress/Archive/Zip/ZipArchive.cs
@@ -148,7 +148,11 @@ namespace SharpCompress.Archive.Zip
protected override IEnumerable LoadVolumes(FileInfo file, Options options)
{
- return new ZipVolume(file, options).AsEnumerable();
+ if (FlagUtility.HasFlag(options, Options.KeepStreamsOpen))
+ {
+ options = (Options)FlagUtility.SetFlag(options, Options.KeepStreamsOpen, false);
+ }
+ return new ZipVolume(file.OpenRead(), options).AsEnumerable();
}
#endif
diff --git a/SharpCompress/Common/GZip/GZipVolume.cs b/SharpCompress/Common/GZip/GZipVolume.cs
index 93b3cf7a..82c7fd7f 100644
--- a/SharpCompress/Common/GZip/GZipVolume.cs
+++ b/SharpCompress/Common/GZip/GZipVolume.cs
@@ -21,16 +21,6 @@ namespace SharpCompress.Common.GZip
}
#endif
-#if !PORTABLE && !NETFX_CORE
- ///
- /// File that backs this volume, if it not stream based
- ///
- public override FileInfo VolumeFile
- {
- get { return fileInfo; }
- }
-#endif
-
public override bool IsFirstVolume
{
get { return true; }
diff --git a/SharpCompress/Common/GenericVolume.cs b/SharpCompress/Common/GenericVolume.cs
deleted file mode 100644
index 589c7acc..00000000
--- a/SharpCompress/Common/GenericVolume.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System.IO;
-
-namespace SharpCompress.Common
-{
- public class GenericVolume : Volume
- {
-#if !PORTABLE && !NETFX_CORE
- private FileInfo fileInfo;
-#endif
-
- public GenericVolume(Stream stream, Options options)
- : base(stream, options)
- {
- }
-
-#if !PORTABLE && !NETFX_CORE
- public GenericVolume(FileInfo fileInfo, Options options)
- : base(fileInfo.OpenRead(), options)
- {
- this.fileInfo = fileInfo;
- }
-#endif
-
-#if !PORTABLE && !NETFX_CORE
- ///
- /// File that backs this volume, if it not stream based
- ///
- public override FileInfo VolumeFile
- {
- get { return fileInfo; }
- }
-#endif
-
- public override bool IsFirstVolume
- {
- get { return true; }
- }
-
- public override bool IsMultiVolume
- {
- get { return true; }
- }
- }
-}
\ No newline at end of file
diff --git a/SharpCompress/Common/IVolume.cs b/SharpCompress/Common/IVolume.cs
index c73a24a6..6482e575 100644
--- a/SharpCompress/Common/IVolume.cs
+++ b/SharpCompress/Common/IVolume.cs
@@ -7,11 +7,5 @@ namespace SharpCompress.Common
{
public interface IVolume : IDisposable
{
-#if !PORTABLE && !NETFX_CORE
- ///
- /// File that backs this volume, if it not stream based
- ///
- FileInfo VolumeFile { get; }
-#endif
}
}
\ No newline at end of file
diff --git a/SharpCompress/Common/Rar/RarVolume.cs b/SharpCompress/Common/Rar/RarVolume.cs
index 05480d16..b0eaa76b 100644
--- a/SharpCompress/Common/Rar/RarVolume.cs
+++ b/SharpCompress/Common/Rar/RarVolume.cs
@@ -18,7 +18,6 @@ namespace SharpCompress.Common.Rar
internal RarVolume(StreamingMode mode, Stream stream, Options options)
: this(mode, stream, null, options)
{
-
}
internal RarVolume(StreamingMode mode, Stream stream, string password, Options options)
diff --git a/SharpCompress/Common/SevenZip/SevenZipVolume.cs b/SharpCompress/Common/SevenZip/SevenZipVolume.cs
index dab7f16c..c5d5f9dd 100644
--- a/SharpCompress/Common/SevenZip/SevenZipVolume.cs
+++ b/SharpCompress/Common/SevenZip/SevenZipVolume.cs
@@ -2,18 +2,11 @@
namespace SharpCompress.Common.SevenZip
{
- public class SevenZipVolume : GenericVolume
+ public class SevenZipVolume : Volume
{
public SevenZipVolume(Stream stream, Options options)
: base(stream, options)
{
}
-
-#if !PORTABLE && !NETFX_CORE
- public SevenZipVolume(FileInfo fileInfo, Options options)
- : base(fileInfo, options)
- {
- }
-#endif
}
}
\ No newline at end of file
diff --git a/SharpCompress/Common/Tar/TarVolume.cs b/SharpCompress/Common/Tar/TarVolume.cs
index bd2b79d1..f70da6d0 100644
--- a/SharpCompress/Common/Tar/TarVolume.cs
+++ b/SharpCompress/Common/Tar/TarVolume.cs
@@ -2,18 +2,11 @@
namespace SharpCompress.Common.Tar
{
- public class TarVolume : GenericVolume
+ public class TarVolume : Volume
{
public TarVolume(Stream stream, Options options)
: base(stream, options)
{
}
-
-#if !PORTABLE && !NETFX_CORE
- public TarVolume(FileInfo fileInfo, Options options)
- : base(fileInfo, options)
- {
- }
-#endif
}
}
\ No newline at end of file
diff --git a/SharpCompress/Common/Volume.cs b/SharpCompress/Common/Volume.cs
index 901ed47b..5f12cc9e 100644
--- a/SharpCompress/Common/Volume.cs
+++ b/SharpCompress/Common/Volume.cs
@@ -24,16 +24,18 @@ namespace SharpCompress.Common
/// RarArchive is the first volume of a multi-part archive.
/// Only Rar 3.0 format and higher
///
- public abstract bool IsFirstVolume { get; }
+ public virtual bool IsFirstVolume
+ {
+ get { return true; }
+ }
///
/// RarArchive is part of a multi-part archive.
///
- public abstract bool IsMultiVolume { get; }
-
-#if !PORTABLE && !NETFX_CORE
- public abstract FileInfo VolumeFile { get; }
-#endif
+ public virtual bool IsMultiVolume
+ {
+ get { return true; }
+ }
private bool disposed;
diff --git a/SharpCompress/Common/Zip/ZipVolume.cs b/SharpCompress/Common/Zip/ZipVolume.cs
index 72bbbe9a..1f3fdd97 100644
--- a/SharpCompress/Common/Zip/ZipVolume.cs
+++ b/SharpCompress/Common/Zip/ZipVolume.cs
@@ -2,20 +2,13 @@
namespace SharpCompress.Common.Zip
{
- public class ZipVolume : GenericVolume
+ public class ZipVolume : Volume
{
public ZipVolume(Stream stream, Options options)
: base(stream, options)
{
}
-#if !PORTABLE && !NETFX_CORE
- public ZipVolume(FileInfo fileInfo, Options options)
- : base(fileInfo, options)
- {
- }
-#endif
-
public string Comment { get; internal set; }
}
}
\ No newline at end of file
diff --git a/SharpCompress/Reader/Rar/NonSeekableStreamFilePart.cs b/SharpCompress/Reader/Rar/NonSeekableStreamFilePart.cs
index ba9f3691..3d4d8faa 100644
--- a/SharpCompress/Reader/Rar/NonSeekableStreamFilePart.cs
+++ b/SharpCompress/Reader/Rar/NonSeekableStreamFilePart.cs
@@ -18,7 +18,7 @@ namespace SharpCompress.Reader.Rar
internal override string FilePartName
{
- get { return "Unknown Stream - File Entry: " + base.FileHeader.FileName; }
+ get { return "Unknown Stream - File Entry: " + FileHeader.FileName; }
}
}
}
\ No newline at end of file
diff --git a/SharpCompress/Reader/Rar/RarReaderVolume.cs b/SharpCompress/Reader/Rar/RarReaderVolume.cs
index d24e63bd..2b92e8b3 100644
--- a/SharpCompress/Reader/Rar/RarReaderVolume.cs
+++ b/SharpCompress/Reader/Rar/RarReaderVolume.cs
@@ -9,8 +9,6 @@ namespace SharpCompress.Reader.Rar
{
public class RarReaderVolume : RarVolume
{
-
-
internal RarReaderVolume(Stream stream, string password, Options options)
: base(StreamingMode.Streaming, stream, password, options)
{
@@ -25,13 +23,5 @@ namespace SharpCompress.Reader.Rar
{
return GetVolumeFileParts();
}
-
-
-#if !PORTABLE && !NETFX_CORE
- public override FileInfo VolumeFile
- {
- get { return null; }
- }
-#endif
}
}
\ No newline at end of file
diff --git a/SharpCompress/SharpCompress.csproj b/SharpCompress/SharpCompress.csproj
index a9969b45..92695cef 100644
--- a/SharpCompress/SharpCompress.csproj
+++ b/SharpCompress/SharpCompress.csproj
@@ -116,7 +116,6 @@
-
@@ -281,7 +280,7 @@
-
+