1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using SharpCompress.Common;
- using SharpCompress.Common.Rar;
- using SharpCompress.Common.Rar.Headers;
- using SharpCompress.Compressors.Rar;
- namespace SharpCompress.Archives.Rar
- {
- public class RarArchiveEntry : RarEntry, IArchiveEntry
- {
- private readonly ICollection<RarFilePart> parts;
- private readonly RarArchive archive;
- internal RarArchiveEntry(RarArchive archive, IEnumerable<RarFilePart> parts)
- {
- this.parts = parts.ToList();
- this.archive = archive;
- }
- public override CompressionType CompressionType => CompressionType.Rar;
- public IArchive Archive => archive;
- internal override IEnumerable<FilePart> Parts => parts.Cast<FilePart>();
- internal override FileHeader FileHeader => parts.First().FileHeader;
- public override long Crc
- {
- get
- {
- CheckIncomplete();
- return parts.Select(fp => fp.FileHeader).Single(fh => !fh.IsSplitAfter).FileCrc;
- }
- }
- public override long Size
- {
- get
- {
- CheckIncomplete();
- return parts.First().FileHeader.UncompressedSize;
- }
- }
- public override long CompressedSize
- {
- get
- {
- CheckIncomplete();
- return parts.Aggregate(0L, (total, fp) => total + fp.FileHeader.CompressedSize);
- }
- }
- public Stream OpenEntryStream()
- {
- if (archive.IsSolid)
- {
- throw new InvalidOperationException("Use ExtractAllEntries to extract SOLID archives.");
- }
- if (IsRarV3)
- {
- return new RarStream(archive.UnpackV1.Value, FileHeader, new MultiVolumeReadOnlyStream(Parts.Cast<RarFilePart>(), archive));
- }
-
- return new RarStream(archive.UnpackV2017.Value, FileHeader, new MultiVolumeReadOnlyStream(Parts.Cast<RarFilePart>(), archive));
- }
- public bool IsComplete
- {
- get
- {
- return parts.Select(fp => fp.FileHeader).Any(fh => !fh.IsSplitAfter);
- }
- }
- private void CheckIncomplete()
- {
- if (!IsComplete)
- {
- throw new IncompleteArchiveException("ArchiveEntry is incomplete and cannot perform this operation.");
- }
- }
- }
- }
|