| // ZipFile.x-IEnumerable.cs | |
| // ------------------------------------------------------------------ | |
| // | |
| // Copyright (c) 2006, 2007, 2008, 2009 Dino Chiesa and Microsoft Corporation. | |
| // All rights reserved. | |
| // | |
| // This code module is part of DotNetZip, a zipfile class library. | |
| // | |
| // ------------------------------------------------------------------ | |
| // | |
| // This code is licensed under the Microsoft Public License. | |
| // See the file License.txt for the license details. | |
| // More info on: http://dotnetzip.codeplex.com | |
| // | |
| // ------------------------------------------------------------------ | |
| // | |
| // last saved (in emacs): | |
| // Time-stamp: <2009-December-26 15:13:26> | |
| // | |
| // ------------------------------------------------------------------ | |
| // | |
| // This module defines smoe methods for IEnumerable support. It is | |
| // particularly important for COM to have these things in a separate module. | |
| // | |
| // ------------------------------------------------------------------ | |
| namespace OfficeOpenXml.Packaging.Ionic.Zip | |
| { | |
| // For some weird reason, the method with the DispId(-4) attribute, which is used as | |
| // the _NewEnum() method, and which is required to get enumeration to work from COM | |
| // environments like VBScript and Javascript (etc) must be the LAST MEMBER in the | |
| // source. In the event of Partial classes, it needs to be the last member defined | |
| // in the last source module. The source modules are ordered alphabetically by | |
| // filename. Not sure why this is true. In any case, we put the enumeration stuff | |
| // here in this oddly-named module, for this reason. | |
| // | |
| internal partial class ZipFile | |
| { | |
| /// <summary> | |
| /// Generic IEnumerator support, for use of a ZipFile in an enumeration. | |
| /// </summary> | |
| /// | |
| /// <remarks> | |
| /// You probably do not want to call <c>GetEnumerator</c> explicitly. Instead | |
| /// it is implicitly called when you use a <see langword="foreach"/> loop in C#, or a | |
| /// <c>For Each</c> loop in VB.NET. | |
| /// </remarks> | |
| /// | |
| /// <example> | |
| /// This example reads a zipfile of a given name, then enumerates the | |
| /// entries in that zip file, and displays the information about each | |
| /// entry on the Console. | |
| /// <code> | |
| /// using (ZipFile zip = ZipFile.Read(zipfile)) | |
| /// { | |
| /// bool header = true; | |
| /// foreach (ZipEntry e in zip) | |
| /// { | |
| /// if (header) | |
| /// { | |
| /// System.Console.WriteLine("Zipfile: {0}", zip.Name); | |
| /// System.Console.WriteLine("Version Needed: 0x{0:X2}", e.VersionNeeded); | |
| /// System.Console.WriteLine("BitField: 0x{0:X2}", e.BitField); | |
| /// System.Console.WriteLine("Compression Method: 0x{0:X2}", e.CompressionMethod); | |
| /// System.Console.WriteLine("\n{1,-22} {2,-6} {3,4} {4,-8} {0}", | |
| /// "Filename", "Modified", "Size", "Ratio", "Packed"); | |
| /// System.Console.WriteLine(new System.String('-', 72)); | |
| /// header = false; | |
| /// } | |
| /// | |
| /// System.Console.WriteLine("{1,-22} {2,-6} {3,4:F0}% {4,-8} {0}", | |
| /// e.FileName, | |
| /// e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), | |
| /// e.UncompressedSize, | |
| /// e.CompressionRatio, | |
| /// e.CompressedSize); | |
| /// | |
| /// e.Extract(); | |
| /// } | |
| /// } | |
| /// </code> | |
| /// | |
| /// <code lang="VB"> | |
| /// Dim ZipFileToExtract As String = "c:\foo.zip" | |
| /// Using zip As ZipFile = ZipFile.Read(ZipFileToExtract) | |
| /// Dim header As Boolean = True | |
| /// Dim e As ZipEntry | |
| /// For Each e In zip | |
| /// If header Then | |
| /// Console.WriteLine("Zipfile: {0}", zip.Name) | |
| /// Console.WriteLine("Version Needed: 0x{0:X2}", e.VersionNeeded) | |
| /// Console.WriteLine("BitField: 0x{0:X2}", e.BitField) | |
| /// Console.WriteLine("Compression Method: 0x{0:X2}", e.CompressionMethod) | |
| /// Console.WriteLine(ChrW(10) & "{1,-22} {2,-6} {3,4} {4,-8} {0}", _ | |
| /// "Filename", "Modified", "Size", "Ratio", "Packed" ) | |
| /// Console.WriteLine(New String("-"c, 72)) | |
| /// header = False | |
| /// End If | |
| /// Console.WriteLine("{1,-22} {2,-6} {3,4:F0}% {4,-8} {0}", _ | |
| /// e.FileName, _ | |
| /// e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), _ | |
| /// e.UncompressedSize, _ | |
| /// e.CompressionRatio, _ | |
| /// e.CompressedSize ) | |
| /// e.Extract | |
| /// Next | |
| /// End Using | |
| /// </code> | |
| /// </example> | |
| /// | |
| /// <returns>A generic enumerator suitable for use within a foreach loop.</returns> | |
| public System.Collections.Generic.IEnumerator<ZipEntry> GetEnumerator() | |
| { | |
| foreach (ZipEntry e in _entries.Values) | |
| yield return e; | |
| } | |
| System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() | |
| { | |
| return GetEnumerator(); | |
| } | |
| /// <summary> | |
| /// An IEnumerator, for use of a ZipFile in a foreach construct. | |
| /// </summary> | |
| /// | |
| /// <remarks> | |
| /// This method is included for COM support. An application generally does not call | |
| /// this method directly. It is called implicitly by COM clients when enumerating | |
| /// the entries in the ZipFile instance. In VBScript, this is done with a <c>For Each</c> | |
| /// statement. In Javascript, this is done with <c>new Enumerator(zipfile)</c>. | |
| /// </remarks> | |
| /// | |
| /// <returns> | |
| /// The IEnumerator over the entries in the ZipFile. | |
| /// </returns> | |
| [System.Runtime.InteropServices.DispId(-4)] | |
| public System.Collections.IEnumerator GetNewEnum() // the name of this method is not significant | |
| { | |
| return GetEnumerator(); | |
| } | |
| } | |
| } |