protected override int DoExecute(ITaskContextInternal context) { OSPlatform os = context.Properties.GetOSPlatform(); DoLogInfo($"Extract {_fileName} to {_destination}"); if (!Directory.Exists(_destination)) { Directory.CreateDirectory(_destination); } using (Stream zip = File.OpenRead(_fileName)) using (ZipArchive archive = new ZipArchive(zip, ZipArchiveMode.Read)) { ZipArchiveEntry metaEntry = archive.Entries.FirstOrDefault(i => i.FullName == Zipper.MetadataFileName); ZipMetadata metadata = null; if (metaEntry != null) { using (Stream ms = metaEntry.Open()) using (var sr = new StreamReader(ms)) { var serializer = new JsonSerializer(); metadata = serializer.Deserialize <ZipMetadata>(new JsonTextReader(sr)); } } foreach (ZipArchiveEntry entry in archive.Entries) { string zipFile = entry.FullName; if (zipFile.EndsWith("/")) { continue; } if (metadata == null) { ExtractToFiles(context, entry, os, new List <string> { zipFile }); continue; } ZipMetadataItem metaItem = metadata.Items.FirstOrDefault(i => i.FileName == zipFile); if (metaItem == null) { DoLogInfo($"{zipFile} not found in metadata!"); continue; } ExtractToFiles(context, entry, os, metaItem.DestinationFiles); } } return(0); }
/// <summary> /// Get Zip Metadata using stream /// Feature is supported in version 18.5 or greater of the API /// </summary> public static void GetZipMatadataUsingStream() { try { using (Stream stream = File.Open(Common.MapSourceFilePath(filePath), FileMode.Open, FileAccess.ReadWrite)) { using (ZipFormat format = new ZipFormat(stream)) { // get info ZipMetadata info = format.ZipInfo; // get total entries Console.WriteLine("Total Entries : {0}, ", info.TotalEntries); //get comments Console.WriteLine("Comments : {0}, ", info.Comment); foreach (var fileInfo in info.Files) { // get file name Console.WriteLine("File Name : {0}, ", fileInfo.Name); // get compressed size Console.WriteLine("CompressedSize : {0}, ", fileInfo.CompressedSize); // get uncompressed size Console.WriteLine("UncompressedSize : {0}, ", fileInfo.UncompressedSize); // get compression method Console.WriteLine("CompressionMethod : {0}, ", fileInfo.CompressionMethod); } } // The stream is still open here } } catch (Exception ex) { Console.WriteLine(ex.Message); } }
/// <summary> /// Gets info of Zip file /// </summary> /// public static void GetZipMatadata() { try { //ExStart:GetZipMatadata // initialize using (ZipFormat zipFormat = new ZipFormat(Common.MapSourceFilePath(filePath))) { // get info ZipMetadata info = zipFormat.ZipInfo; // get total entries Console.WriteLine("Total Entries : {0}, ", info.TotalEntries); //get comments Console.WriteLine("Comments : {0}, ", info.Comment); foreach (var fileInfo in info.Files) { // get file name Console.WriteLine("File Name : {0}, ", fileInfo.Name); // get compressed size Console.WriteLine("CompressedSize : {0}, ", fileInfo.CompressedSize); // get uncompressed size Console.WriteLine("UncompressedSize : {0}, ", fileInfo.UncompressedSize); // get compression method Console.WriteLine("CompressionMethod : {0}, ", fileInfo.CompressionMethod); } } //ExEnd:GetZipMatadata } catch (Exception exp) { Console.WriteLine(exp.Message); } }