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