Use ExtractAllEntries if archives are SOLID types

This commit is contained in:
Adam Hathcock
2016-01-26 11:49:57 +00:00
parent 526df2404e
commit 0de64b1551
3 changed files with 8 additions and 36 deletions

View File

@@ -14,9 +14,6 @@ namespace SharpCompress.Archive.Rar
{
public class RarArchive : AbstractArchive<RarArchiveEntry, RarVolume>
{
internal IEnumerator<RarArchiveEntry> SolidEntryEnumerator;
internal List<RarArchiveEntry> SolidReadedEntries=new List<RarArchiveEntry>();
private readonly Unpack unpack = new Unpack();
internal Unpack Unpack

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -70,43 +71,12 @@ namespace SharpCompress.Archive.Rar
return parts.Aggregate(0L, (total, fp) => { return total + fp.FileHeader.CompressedSize; });
}
}
private readonly byte[] skipBuffer = new byte[4096];
private void Skip(RarArchiveEntry en)
{
using (var s = new RarStream(archive.Unpack, en.FileHeader, new MultiVolumeReadOnlyStream(en.parts, archive)))
{
while (s.Read(skipBuffer, 0, skipBuffer.Length) > 0);
}
}
private void MoveNext()
{
archive.SolidReadedEntries.Add(archive.SolidEntryEnumerator.Current);
if (!archive.SolidEntryEnumerator.MoveNext())
{
archive.SolidEntryEnumerator = archive.Entries.GetEnumerator();
archive.SolidReadedEntries = new List<RarArchiveEntry>();
archive.SolidEntryEnumerator.MoveNext();
}
}
public Stream OpenEntryStream()
{
if (archive.IsSolid)
{
if ((archive.SolidEntryEnumerator == null) || (archive.SolidReadedEntries.Any(b=>b.FileHeader==FileHeader)))
{
archive.SolidEntryEnumerator = archive.Entries.GetEnumerator();
archive.SolidReadedEntries = new List<RarArchiveEntry>();
archive.SolidEntryEnumerator.MoveNext();
}
while (archive.SolidEntryEnumerator.Current.FileHeader != FileHeader)
{
Skip(archive.SolidEntryEnumerator.Current);
MoveNext();
}
MoveNext();
throw new InvalidOperationException("Use ExtractAllEntries to extract SOLID archives.");
}
return new RarStream(archive.Unpack, FileHeader, new MultiVolumeReadOnlyStream(Parts.Cast<RarFilePart>(), archive));
}

View File

@@ -1,4 +1,5 @@
using System.IO;
using System;
using System.IO;
using SharpCompress.Common.SevenZip;
namespace SharpCompress.Archive.SevenZip
@@ -13,6 +14,10 @@ namespace SharpCompress.Archive.SevenZip
public Stream OpenEntryStream()
{
if (Archive.IsSolid)
{
throw new InvalidOperationException("Use ExtractAllEntries to extract SOLID archives.");
}
return FilePart.GetCompressedStream();
}
public IArchive Archive { get; private set; }