mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-09-25 08:24:58 +00:00
Use ExtractAllEntries if archives are SOLID types
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user