public void ExtractFiles(string directory, params int[] indexes) { this.DisposedCheck(); this.ClearExceptions(); if (!SevenZipExtractor.CheckIndexes(indexes)) { if (!this.ThrowException((SevenZipBase)null, (Exception) new ArgumentException("The indexes must be more or equal to zero.", nameof(indexes)))) { return; } } this.InitArchiveFileData(false); uint[] numArray = new uint[indexes.Length]; for (int index = 0; index < indexes.Length; ++index) { numArray[index] = (uint)indexes[index]; } foreach (uint num in numArray) { uint?filesCount = this._FilesCount; if ((num < filesCount.GetValueOrDefault() ? 0 : (filesCount.HasValue ? 1 : 0)) != 0) { if (!this.ThrowException((SevenZipBase)null, (Exception) new ArgumentOutOfRangeException(nameof(indexes), "Index must be less than " + this._FilesCount.Value.ToString((IFormatProvider)CultureInfo.InvariantCulture) + "!"))) { return; } } } List <uint> actualIndexes = new List <uint>((IEnumerable <uint>)numArray); actualIndexes.Sort(); uint[] indexes1 = actualIndexes.ToArray(); if (this._IsSolid.Value) { indexes1 = SevenZipExtractor.SolidIndexes(indexes1); } try { IInStream archiveStream; using ((archiveStream = this.GetArchiveStream(actualIndexes.Count != 1)) as IDisposable) { ArchiveOpenCallback archiveOpenCallback = this.GetArchiveOpenCallback(); ulong maxCheckStartPosition = 32768; if (!this._Opened) { if (this._Archive.Open(archiveStream, ref maxCheckStartPosition, (IArchiveOpenCallback)archiveOpenCallback) != 0) { if (!this.ThrowException((SevenZipBase)null, (Exception) new SevenZipArchiveException())) { return; } } this._Opened = true; } using (ArchiveExtractCallback archiveExtractCallback = this.GetArchiveExtractCallback(directory, (int)this._FilesCount.Value, actualIndexes)) { try { this.CheckedExecute(this._Archive.Extract(indexes1, (uint)indexes1.Length, 0, (IArchiveExtractCallback)archiveExtractCallback), "The extraction has failed for an unknown reason with code ", (SevenZipBase)archiveExtractCallback); } finally { this.FreeArchiveExtractCallback(archiveExtractCallback); } } } this.OnExtractionFinished(EventArgs.Empty); } finally { if (actualIndexes.Count > 1) { this._Archive.Close(); this._ArchiveStream = (IInStream)null; this._Opened = false; } } this.ThrowUserException(); }
public void ExtractFile(int index, Stream stream) { this.DisposedCheck(); this.ClearExceptions(); if (!SevenZipExtractor.CheckIndexes(index)) { if (!this.ThrowException((SevenZipBase)null, (Exception) new ArgumentException("The index must be more or equal to zero.", nameof(index)))) { return; } } if (!stream.CanWrite) { if (!this.ThrowException((SevenZipBase)null, (Exception) new ArgumentException("The specified stream can not be written.", nameof(stream)))) { return; } } this.InitArchiveFileData(false); long num = (long)index; uint?filesCount = this._FilesCount; uint?nullable = filesCount.HasValue ? new uint?(filesCount.GetValueOrDefault() - 1U) : new uint?(); if ((num <= (long)nullable.GetValueOrDefault() ? 0 : (nullable.HasValue ? 1 : 0)) != 0) { if (!this.ThrowException((SevenZipBase)null, (Exception) new ArgumentOutOfRangeException(nameof(index), "The specified index is greater than the archive files count."))) { return; } } uint[] indexes = new uint[1] { (uint)index }; if (this._IsSolid.Value) { indexes = SevenZipExtractor.SolidIndexes(indexes); } IInStream archiveStream = this.GetArchiveStream(false); ArchiveOpenCallback archiveOpenCallback = this.GetArchiveOpenCallback(); ulong maxCheckStartPosition = 32768; if (!this._Opened) { if (this._Archive.Open(archiveStream, ref maxCheckStartPosition, (IArchiveOpenCallback)archiveOpenCallback) != 0) { this.ThrowException((SevenZipBase)null, (Exception) new SevenZipArchiveException()); } this._Opened = true; } using (ArchiveExtractCallback archiveExtractCallback = this.GetArchiveExtractCallback(stream, (uint)index, indexes.Length)) { try { this.CheckedExecute(this._Archive.Extract(indexes, (uint)indexes.Length, 0, (IArchiveExtractCallback)archiveExtractCallback), "The extraction has failed for an unknown reason with code ", (SevenZipBase)archiveExtractCallback); } finally { this.FreeArchiveExtractCallback(archiveExtractCallback); } } this.OnExtractionFinished(EventArgs.Empty); this.ThrowUserException(); }