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 @@ - +