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); }
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); }
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); } } }
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); }
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); }
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); }
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); }