Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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();
        }