public SevenZipFormat(string sevenZipLibPath) { this.LibHandle = SevenZipFormat.LoadLibrary(sevenZipLibPath); if (this.LibHandle.IsInvalid) { throw new Win32Exception(); } if (SevenZipFormat.GetProcAddress(this.LibHandle, "GetHandlerProperty") == IntPtr.Zero) { this.LibHandle.Close(); throw new ArgumentException(); } }
private static void ListOrExtract(string archiveName, uint level) { using (SevenZipFormat Format = new SevenZipFormat(SevenZipDllPath)) { IInArchive Archive = Format.CreateInArchive(SevenZipFormat.GetClassIdFromKnownFormat(KnownSevenZipFormat.Zip)); 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) //ShowHelp(); if (!Directory.Exists(@"tmp_dir")) Directory.CreateDirectory(@"tmp_dir"); //Console.WriteLine(archiveName); uint Count = Archive.GetNumberOfItems(); for (uint I = 0; I < Count; I++) { PropVariant Name = new PropVariant(); Archive.GetProperty(I, ItemPropId.kpidPath, ref Name); string FileName = (string)Name.GetObject(); Program.f1.label1.Text = FileName; Application.DoEvents(); for(int i = 0; i < level; i++) Console.Write("\t"); Console.Write(FileName + "\n"); FileName += level; Archive.Extract(new uint[] { I }, 1, 0, new ArchiveExtractCallback(I, FileName)); Program.Determine_Parser(new System.IO.FileInfo("tmp_dir//" + FileName), level); } } } finally { Marshal.ReleaseComObject(Archive); Directory.Delete(@"tmp_dir", true); } } }
static void Main(string[] args) { if (args.Length < 2) { ShowHelp(); return; } try { string ArchiveName; uint FileNumber = 0xFFFFFFFF; bool Extract; switch (args[0]) { case "l": ArchiveName = args[1]; Extract = false; break; case "e": ArchiveName = args[1]; Extract = true; if ((args.Length < 3) || !uint.TryParse(args[2], out FileNumber)) { ShowHelp(); return; } break; default: ShowHelp(); return; } using (SevenZipFormat Format = new SevenZipFormat(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "7z.dll"))) { IInArchive Archive = Format.CreateInArchive(SevenZipFormat.GetClassIdFromKnownFormat(KnownSevenZipFormat.Zip)); if (Archive == null) { ShowHelp(); return; } try { using (InStreamWrapper ArchiveStream = new InStreamWrapper(File.OpenRead(ArchiveName))) { ulong CheckPos = 32 * 1024; if (Archive.Open(ArchiveStream, ref CheckPos, null) != 0) ShowHelp(); Console.Write("Archive: "); Console.WriteLine(ArchiveName); if (Extract) { PropVariant Name = new PropVariant(); Archive.GetProperty(FileNumber, ItemPropId.kpidPath, ref Name); string FileName = (string)Name.GetObject(); Console.Write("Extracting: "); Console.Write(FileName); Console.Write(' '); Archive.Extract(new uint[] { FileNumber }, 1, 0, new ArchiveCallback(FileNumber, FileName)); } else { Console.WriteLine("List:"); uint Count = Archive.GetNumberOfItems(); for (uint I = 0; I < Count; I++) { PropVariant Name = new PropVariant(); Archive.GetProperty(I, ItemPropId.kpidPath, ref Name); Console.Write(I); Console.Write(' '); Console.WriteLine(Name.GetObject()); } } } } finally { Marshal.ReleaseComObject(Archive); } } } catch (Exception e) { Console.Write("Error: "); Console.WriteLine(e.Message); } }
public IInArchive CreateInArchive(Guid classId) { object obj = null; if (this.LibHandle == null) { throw new ObjectDisposedException("SevenZipFormat"); } CreateObjectDelegate delegateForFunctionPointer = (CreateObjectDelegate)Marshal.GetDelegateForFunctionPointer(SevenZipFormat.GetProcAddress(this.LibHandle, "CreateObject"), typeof(CreateObjectDelegate)); if (delegateForFunctionPointer == null) { return(null); } Guid gUID = typeof(IInArchive).GUID; delegateForFunctionPointer(ref classId, ref gUID, out obj); return(obj as IInArchive); }