示例#1
0
 static int CountFilesInArchive(string arcName)
 {
     arhContent = new List <string>();
     using (SevenZipFormat Format = new SevenZipFormat(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "7z.dll")))
     {
         IInArchive Archive = Format.CreateInArchive(SevenZipFormat.GetClassIdFromKnownFormat(KnownSevenZipFormat.Arj));
         if (Archive == null)
         {
             return(0);
         }
         try
         {
             using (InStreamWrapper ArchiveStream = new InStreamWrapper(File.OpenRead(arcName)))
             {
                 ulong checkPos = 32 * 1024;
                 if (Archive.Open(ArchiveStream, ref checkPos, null) != 0)
                 {
                     Console.WriteLine("Error!!!");
                 }
                 uint Count = Archive.GetNumberOfItems();
                 for (uint i = 0; i < Count; i++)
                 {
                     PropVariant Name = new PropVariant();
                     Archive.GetProperty(i, ItemPropId.kpidPath, ref Name);
                     arhContent.Add(Name.GetObject().ToString());
                 }
             }
         }
         finally
         {
             Marshal.ReleaseComObject(Archive);
         }
     }
     return(arhContent.Count);
 }
        /// <summary>
        /// Opens the archive and throws exceptions or returns OperationResult.DataError if any error occurs.
        /// </summary>
        /// <param name="archiveStream">The IInStream compliant class instance, that is, the input stream.</param>
        /// <param name="openCallback">The ArchiveOpenCallback instance.</param>
        /// <returns>OperationResult.Ok if Open() succeeds.</returns>
        private OperationResult OpenArchiveInner(IInStream archiveStream,
                                                 IArchiveOpenCallback openCallback)
        {
            ulong checkPos = 1 << 15;
            int   res      = _archive.Open(archiveStream, ref checkPos, openCallback);

            return((OperationResult)res);
        }
示例#3
0
        public string Extract(string archiveName, string folderToExtract, uint fileNumber, KnownSevenZipFormat ZipFormat, out bool isDirectory)
        {
            isDirectory = false;

            ZipFormatG = ZipFormat;

            string FileName = null;

            try
            {
                using (SevenZipFormat Format = new SevenZipFormat(SevenZipDllPath))
                {
                    IInArchive Archive = Format.CreateInArchive(SevenZipFormat.GetClassIdFromKnownFormat(ZipFormat));
                    if (Archive == null)
                    {
                        return(null);
                    }

                    try
                    {
                        using (InStreamWrapper ArchiveStream = new InStreamWrapper(File.OpenRead(archiveName)))
                        {
                            IArchiveOpenCallback OpenCallback = new ArchiveOpenCallback();

                            ulong CheckPos = 256 * 1024;

                            if (Archive.Open(ArchiveStream, ref CheckPos, OpenCallback) != 0)
                            {
                                return(null);
                            }

                            PropVariant Name = new PropVariant();
                            Archive.GetProperty(fileNumber, ItemPropId.kpidPath, ref Name);
                            FileName = (string)Name.GetObject();
                            Archive.GetProperty(fileNumber, ItemPropId.kpidIsFolder, ref Name);
                            isDirectory = (bool)Name.GetObject();

                            if (!isDirectory)
                            {
                                Archive.Extract(new uint[] { fileNumber }, 1, 0, new ArchiveExtractCallback(fileNumber, folderToExtract + FileName));
                            }
                        }
                    }
                    finally
                    {
                        Marshal.ReleaseComObject(Archive);
                    }
                }
            }
            catch
            {
            }
            return(FileName);
        }
示例#4
0
        private static void ListOrExtract(string archiveName, string extractLocation, bool extract)
        {
            using (SevenZipFormat Format = new SevenZipFormat(SevenZDllPath)) {
                IInArchive Archive = Format.CreateInArchive(SevenZipFormat.GetClassIdFromKnownFormat(KnownSevenZipFormat.SevenZip));
                if (Archive == null)
                {
                    return;
                }

                try {
                    using (InStreamWrapper ArchiveStream = new InStreamWrapper(File.OpenRead(archiveName))) {
                        IArchiveOpenCallback OpenCallback = new ArchiveOpenCallback();

                        // 32k CheckPos is not enough for some 7z archive formats
                        ulong CheckPos = 128 * 1024;
                        if (Archive.Open(ArchiveStream, ref CheckPos, OpenCallback) != 0)
                        {
                            return;
                        }

                        if (extract)
                        {
                            uint Count = Archive.GetNumberOfItems();
                            for (int i = 0; i < Count; i++)
                            {
                                PropVariant Name = new PropVariant();
                                Archive.GetProperty((uint)i, ItemPropId.kpidPath, ref Name);
                                string FileName = (string)Name.GetObject();
                                Archive.Extract(new uint[] { (uint)i }, 1, 0, new ArchiveExtractCallback((uint)i, FileName, extractLocation));
                            }
                        }
                        else
                        {
                            //Console.WriteLine("List:");
                            String files = "";
                            uint   Count = Archive.GetNumberOfItems();
                            for (uint I = 0; I < Count; I++)
                            {
                                PropVariant Name = new PropVariant();
                                Archive.GetProperty(I, ItemPropId.kpidPath, ref Name);
                                files += String.Format("{0} - {1}\r\n", I, Name.GetObject());
                            }
                            MessageBox.Show(files);
                        }
                    }
                } finally {
                    Marshal.ReleaseComObject(Archive);
                }
            }
        }
示例#5
0
        private IInArchive LoadArchiveFile(CreateObjectDelegate createObject, Stream fs, List <ArchiveFormat> lstAF)
        {
            int signatureMaxLength = FormatSetting.FileSignatures.Values.OrderByDescending(v => v.Length).First().Length;

            byte[] signatureBuffer = new byte[signatureMaxLength];
            fs.Position = 0;
            int bytesRead        = fs.Read(signatureBuffer, 0, signatureMaxLength);
            var matchedSignature = FormatSetting.FileSignatures.Where(kv => signatureBuffer.Take(kv.Value.Length).SequenceEqual(kv.Value))
                                   .FirstOrDefault();

            if (matchedSignature.Key != ArchiveFormat.Undefined)
            {
                lstAF.Add(matchedSignature.Key);
            }
            var lstAFTemp = FormatSetting.FormatGuidMapping.Select(x => x.Key).Except(lstAF).ToList();

            lstAF.AddRange(lstAFTemp);
            ulong checkPos = 32 * 1024;

            this.Format = ArchiveFormat.Undefined;
            Guid interfaceId = typeof(IInArchive).GUID;

            foreach (var af in lstAF)
            {
                Guid   classId = FormatSetting.FormatGuidMapping[af];
                object tmp     = null;
                createObject.Invoke(ref classId, ref interfaceId, out tmp);
                IInArchive archive7z = tmp as IInArchive;
                fs.Position = 0;
                try
                {
                    int code = archive7z.Open(new QizFileStream(fs), ref checkPos, null);
                    if (code == 0)
                    {
                        this.Format = af;
                        return(archive7z);
                    }
                    Marshal.ReleaseComObject(archive7z);
                }
                catch (Exception)
                {
                    if (archive7z != null)
                    {
                        Marshal.ReleaseComObject(archive7z);
                    }
                }
            }
            return(null);
        }
示例#6
0
        public List <string> List(string archiveName, KnownSevenZipFormat ZipFormat)
        {
            List <string> List = new List <string>();

            using (SevenZipFormat Format = new SevenZipFormat(SevenZipDllPath))
            {
                IInArchive Archive = Format.CreateInArchive(SevenZipFormat.GetClassIdFromKnownFormat(ZipFormat));
                if (Archive == null)
                {
                    return(List);
                }

                try
                {
                    using (InStreamWrapper ArchiveStream = new InStreamWrapper(File.OpenRead(archiveName)))
                    {
                        IArchiveOpenCallback OpenCallback = new ArchiveOpenCallback();

                        ulong CheckPos = 256 * 1024;

                        if (Archive.Open(ArchiveStream, ref CheckPos, OpenCallback) != 0)
                        {
                            return(List);
                        }

                        uint Count = Archive.GetNumberOfItems();
                        for (uint I = 0; I < Count; I++)
                        {
                            PropVariant Name = new PropVariant();
                            Archive.GetProperty(I, ItemPropId.kpidPath, ref Name);
                            string[] T = Name.GetObject().ToString().Split('\\');
                            List.Add(T[T.Length - 1]);
                        }
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(Archive);
                }
            }

            return(List);
        }
示例#7
0
        private void InternalOpen(IArchiveOpenCallback callback, Guid format)
        {
            var    Interface = typeof(IInArchive).GUID;
            object result;

            if (CpuInfo.IsX64)
            {
                SafeNativeMethods.CreateObject_64(ref format, ref Interface, out result);
            }
            else
            {
                SafeNativeMethods.CreateObject_32(ref format, ref Interface, out result);
            }
            if (result == null)
            {
                throw new COMException("Cannot create Archive");
            }
            inArchive = result as IInArchive;

            var sp = (ulong)(1 << 23);

            inArchive.Open(stream, ref sp, callback);
        }
示例#8
0
        private void InternalOpen(IArchiveOpenCallback callback, Guid format)
        {
            var Interface = typeof(IInArchive).GUID;
              object result;
              if (CpuInfo.IsX64) {
            SafeNativeMethods.CreateObject_64(ref format, ref Interface, out result);
              }
              else {
            SafeNativeMethods.CreateObject_32(ref format, ref Interface, out result);
              }
              if (result == null) {
            throw new COMException("Cannot create Archive");
              }
              inArchive = result as IInArchive;

              var sp = (ulong)(1 << 23);
              inArchive.Open(stream, ref sp, callback);
        }
示例#9
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);
        }