示例#1
0
        public bool extract(string archiveName, uint fileNumber, string arcType, ProgressBar progress, Label status)
        {
            Program.form.waitForFreeMemory(status);
            attachedProgressBar = progress;
            attachedStatus      = status;
            status.Text         = "Extracting File " + this.extracting_file;
            progress.Maximum    = 1;
            progress.Value      = 0;
            Application.DoEvents();
            bool flag = false;
            KnownSevenZipFormat format = this.stringToSevenZipFormat(arcType);

            switch (format)
            {
            case KnownSevenZipFormat.SevenZip:
            case KnownSevenZipFormat.Zip:
                break;

            case KnownSevenZipFormat.Rar:
                return(this.extractRar(archiveName, progress, status, true));

            default:
                showError("1.0");
                break;
            }
            using (SevenZipFormat format2 = new SevenZipFormat(SevenZipDllPath))
            {
                if (this.ArchiveIn != null)
                {
                    Marshal.ReleaseComObject(this.ArchiveIn);
                    for (int i = 0; i < 5; i++)
                    {
                        Application.DoEvents();
                    }
                }
                this.ArchiveIn = format2.CreateInArchive(SevenZipFormat.GetClassIdFromKnownFormat(format));
                if (this.ArchiveIn == null)
                {
                    showError("1.1");
                    flag = false;
                }
                try
                {
                    using (InStreamWrapper wrapper = new InStreamWrapper(System.IO.File.OpenRead(archiveName)))
                    {
                        IArchiveOpenCallback openArchiveCallback = new ArchiveOpenCallback();
                        if (this.ArchiveIn.Open(wrapper, 0x20000L, openArchiveCallback) != 0)
                        {
                            showError("1.2");
                            flag = false;
                        }
                        else
                        {
                            PropVariant variant = new PropVariant();
                            this.ArchiveIn.GetProperty(fileNumber, ItemPropId.kpidPath, ref variant);
                            string fileName = (string)variant.GetObject();
                            this.ArchiveIn.Extract(new uint[] { fileNumber }, 1, 0, new ArchiveExtractCallback(fileNumber, fileName));
                            flag = true;
                        }
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(this.ArchiveIn);
                }
            }
            Program.form.waitForFreeMemory(status);
            return(flag);
        }
示例#2
0
        public int findFirstExtInArchive(string ext, string archiveName, string arcType, ProgressBar progress, Label status)
        {
            status.Text      = "Scanning Archive " + archiveName;
            progress.Maximum = 4;
            progress.Value   = 0;
            Application.DoEvents();
            int num = -1;

            using (SevenZipFormat format = new SevenZipFormat(SevenZipDllPath))
            {
                KnownSevenZipFormat sevenZip = KnownSevenZipFormat.SevenZip;
                arcType = arcType.ToLower();
                switch (arcType)
                {
                case "rar":
                    sevenZip = KnownSevenZipFormat.Rar;
                    break;

                case "zip":
                    sevenZip = KnownSevenZipFormat.Zip;
                    break;

                case "7z":
                    sevenZip = KnownSevenZipFormat.SevenZip;
                    break;

                default:
                    showError("0.1");
                    break;
                }
                IInArchive o = format.CreateInArchive(SevenZipFormat.GetClassIdFromKnownFormat(sevenZip));
                if (o == null)
                {
                    showError("0.2");
                    num = -1;
                }
                try
                {
                    using (InStreamWrapper wrapper = new InStreamWrapper(System.IO.File.OpenRead(archiveName)))
                    {
                        IArchiveOpenCallback openArchiveCallback = new ArchiveOpenCallback();
                        if (o.Open(wrapper, 0x40000L, openArchiveCallback) != 0)
                        {
                            showError("0.3");
                            num = -1;
                        }
                        uint numberOfItems = o.GetNumberOfItems();
                        fileInRar = "";
                        for (int i = 0; i < numberOfItems; i++)
                        {
                            PropVariant variant = new PropVariant();
                            o.GetProperty((uint)i, ItemPropId.kpidPath, ref variant);
                            PropVariant variant2 = new PropVariant();
                            o.GetProperty((uint)i, ItemPropId.kpidCRC, ref variant2);
                            if (Program.form.getFileExtension(variant.GetObject().ToString()).ToLower() == ext.ToLower())
                            {
                                num       = i;
                                fileInRar = variant.GetObject().ToString();
                                this.crc_of_extracting_file = long.Parse(variant2.GetObject().ToString()).ToString("X8");
                                return(num);
                            }
                        }
                        return(num);
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(o);
                }
            }
            return(num);
        }