Xceed .NET Libraries Documentation
Events
Welcome to Xceed .NET, .NET Standard and Xamarin Libraries! > Basic Concepts > Zip and streaming capabilities > Real-Time Zip Classes > Events

The ZipWriter and ZipReader classes provides events that let you monitor the progress of the Zip archive creation and extraction processes. Three types of events are available, which are described and demonstrated below.

Event Description
ByteProgression (writing, reading) Used to access byte progression information when reading or writing a Zip archive. Available in ZipWriter and ZipReader.
InvalidPassword Used when an invalid password is provided.

The ByteProgression event

The ZipWriter and ZipReader classes both expose a ByteProgression event, which is raised when WriteItemData or ReadItemData is called.

A ZipWriterByteProgressionEventArgs object provides the following properties for use in ZipWriter's ByteProgression event handler:

Property Description
BytesProcessed The number of bytes processed of the current file.
ZipItemLocalHeader The local header of the item currently being processed.

A ZipReaderByteProgressionEventArgs object provides the following properties for use in ZipReader's ByteProgression event handler:

Property Description
BytesProcessed The number of bytes processed of the current file.
Percent The percentage of the current file that has been processed.
UncompressedSize The uncompressed size of the current file.
ZipItemLocalHeader The local header of the file currently being processed.
When the compressed/uncompressed sizes are unknown, UncompressedSize returns -1 and Percent returns 0, and must therefore not be used. This occurs for example with Zip archives created using ZipWriter, because a backwards seek before the compressed data of a file cannot be performed. Consequently, the values for compressed/uncompressed sizes cannot be modified. A Zip application such as WinZip, however, can seek back and write these values. As a result, when reading such an archive, UncompressedSize and Percent return useful values.

The InvalidPassword event

The ZipReader class additionally exposes an InvalidPassword event, which is raised when no password or an invalid password is provided to a password-protected archive. A ZipReaderInvalidPasswordEventArgs object provides the following properties for use in ZipReader's  InvalidPassword event handler:

Property Description
Abort Indicates whether the Zip read operation should be aborted.
NewPassword The new password to be used during the Zip read operation.
OldPassword The password initially supplied.
ZipItemLocalHeader The local header of the file currently being processed.

Examples

Example 1: Using the ByteProgression event (ZipWriter)

The following examples demonstrate how to use ZipWriter's ByteProgression event, as well as its event arguments.
using System.IO;

using Xceed.Zip.ReaderWriter;

//The target Zip archive.

using (FileStream fileStream1 = new FileStream(@"d:\testOutput\test.zip",

  FileMode.Create, FileAccess.Write))

{

  //Create a ZipWriter object around the stream.

  Xceed.Zip.ReaderWriter.ZipWriter zipWriter1 =

    new Xceed.Zip.ReaderWriter.ZipWriter(fileStream1);

  //Subscribe to the ByteProgression event

  zipWriter1.ByteProgression += new

    EventHandler<ZipWriterByteProgressionEventArgs>(zipWriter1_ByteProgression);

  DirectoryInfo directoryInfo = new DirectoryInfo(@"d:\test\");

  if (directoryInfo.Exists)

  {

    FileInfo[] files = directoryInfo.GetFiles("*.*",

      SearchOption.AllDirectories);

    foreach (FileInfo file in files)

    {

      //Create ZipItemLocalHeader for current item and write to archive.

      ZipItemLocalHeader zipItemLocalHeader1 = new ZipItemLocalHeader

        (file.Name);

      zipWriter1.WriteItemLocalHeader(zipItemLocalHeader1);

      byte[] buffer = new byte[1024];

      int read = 0;

      using (FileStream fs = file.OpenRead())

      {

        //Read the current item's data

        while ((read = fs.Read(buffer, 0, buffer.Length)) != 0)

        {

          //Write the current item's data to the Zip archive

          zipWriter1.WriteItemData(buffer, 0, read);

        }

      }

    }

    //Close the Zip archive

    zipWriter1.CloseZipFile();

    Console.WriteLine("Zip archive created.");

  }

}



//The ByteProgression event's handler. Demonstrates the use of

//the properties of ZipWriterByteProgressionEventArgs.

static void zipWriter1_ByteProgression(object sender, 

  ZipWriterByteProgressionEventArgs e)

{

  Console.WriteLine("Item {0}: CompressionMethod = {1},

    CompressionLevel = {2}.", e.ZipItemLocalHeader.FileName,

    e.ZipItemLocalHeader.CompressionMethod,

    e.ZipItemLocalHeader.CompressionLevel);

}
Imports System.IO

Imports Xceed.Zip.ReaderWriter

'The target Zip archive.

Using fileStream1 As New FileStream("d:\testOutput\test.zip",

  FileMode.Create, FileAccess.Write)



  'Create a ZipWriter object around the stream.

  Dim zipWriter1 As New Xceed.Zip.ReaderWriter.ZipWriter(fileStream1)

  'Subscribe to the ByteProgression event.

  AddHandler zipWriter1.ByteProgression, AddressOf Of

    ZipWriterByteProgressionEventArgs



  Dim directoryInfo As New DirectoryInfo("d:\test\")

  If directoryInfo.Exists Then

    Dim files As FileInfo() = directoryInfo.GetFiles("*.*",

      SearchOption.AllDirectories)

    For Each file As FileInfo In files

      'Create ZipItemLocalHeader for current item and write to archive.

      Dim zipItemLocalHeader1 As New ZipItemLocalHeader(file.Name)

      zipWriter1.WriteItemLocalHeader(zipItemLocalHeader1)

      Dim buffer As Byte() = New Byte(1023){}

      Dim read As Integer = 0

      Using fs As FileStream = file.OpenRead()

        'Read the current item's data

        read = fs.Read(buffer, 0, buffer.Length)

        Do While (read <> 0)

          'Write the current item's data to the Zip archive

          zipWriter1.WriteItemData(buffer, 0, read)

          read = fs.Read(buffer, 0, buffer.Length)

        Loop

      End Using

    Next file

    'Close the Zip archive

    zipWriter1.CloseZipFile()

    Console.WriteLine("Zip archive created.")

  End If

End Using



'The ByteProgression event's handler. Demonstrates the use of

'the properties of ZipWriterByteProgressionEventArgs.

Shared Sub zipWriter1_ByteProgression(ByVal sender As Object, ByVal e As ZipWriterByteProgressionEventArgs)

  Console.WriteLine("Item {0}: CompressionMethod = {1},

    CompressionLevel = {2}.", e.ZipItemLocalHeader.FileName,

    e.ZipItemLocalHeader.CompressionMethod,

    e.ZipItemLocalHeader.CompressionLevel)

End Sub

Example 2: Using the ByteProgression and InvalidPassword events (ZipReader)

The following examples demonstrate how to use ZipReader's ByteProgression and InvalidPassword events, as well as their event arguments.
using System.IO;

using Xceed.Zip.ReaderWriter;

//The source Zip archive.

using (FileStream fileStream1 = new FileStream(@"d:\testOutput\test.zip",

  FileMode.Open, FileAccess.Read))

{

  //Must seek to the beginning of the stream before reading.

  fileStream1.Seek(0, SeekOrigin.Begin);

  //Create a ZipReader around the stream.

  Xceed.Zip.ReaderWriter.ZipReader zipReader1 =

    new Xceed.Zip.ReaderWriter.ZipReader(fileStream1);

  //Subscribe to the ByteProgression event

  zipReader1.ByteProgression +=

    new EventHandler<ZipReaderByteProgressionEventArgs>

    (zipReader1_ByteProgression);

  //Subscribe to the InvalidPassword event

  zipReader1.InvalidPassword +=

    new EventHandler<ZipReaderInvalidPasswordEventArgs>

    (zipReader1_InvalidPassword);

  ZipItemLocalHeader zipItemLocalHeader = null;

  //Read the local headers until no more are found

  while ((zipItemLocalHeader = zipReader1.ReadItemLocalHeader()) != null)

  {

    byte[] buffer = new byte[1024];

    int read = 0;

    //Read the item's data

    while ((read = zipReader1.ReadItemData(buffer, 0, buffer.Length)) > 0)

    {

      //Do something with the data in 'buffer'

    }

  }

}



//The InvalidPassword event's handler. Demonstrates the use of

//the properties of ZipReaderInvalidPasswordEventArgs.

static void zipReader1_InvalidPassword(object sender,

  ZipReaderInvalidPasswordEventArgs e)

{

  Console.Write("Enter password for file {0} (<Enter> alone to abort): ",

    e.ZipItemLocalHeader.FileName);

  string password = Console.ReadLine();

  if (string.IsNullOrEmpty(password))

  {

    //Set Abort to true to abort the read operation.

    e.Abort = true;

  }

  else

  {

    //Set NewPassword to the provided password. If it is the correct password,

    //the read operation will proceed. Otherwise, the InvalidPassword event is

    //raised again.

    e.NewPassword = password;

  }

}

//The ByteProgression event's handler. Demonstrates the use of

//the properties of ZipReaderByteProgressionEventArgs.

static void zipReader1_ByteProgression(object sender,

   ZipReaderByteProgressionEventArgs e)

{

  if (e.UncompressedSize == -1)

    Console.WriteLine("Processing item {0}: {1} bytes processed.",

      e.ZipItemLocalHeader.FileName, e.BytesProcessed);

  else

  {

    //UncompressedSize is not -1, so this property and the Percent property

    //return useful values.

    Console.WriteLine("Processing item {0}: {1} bytes processed ({3}%).

      (Uncompressed size = {3}.)",

      e.ZipItemLocalHeader.FileName,

      e.BytesProcessed,

      e.UncompressedSize,

      e.Percent);

  }

}
Imports System.IO

Imports Xceed.Zip.ReaderWriter

Using fileStream1 As New FileStream("d:\testOutput\test.zip",

  FileMode.Open, FileAccess.Read)



  'Must seek to the beginning of the stream before reading.

  fileStream1.Seek(0, SeekOrigin.Begin)

  'Create a ZipReader around the stream.

  Dim zipReader1 As New Xceed.Zip.ReaderWriter.ZipReader(fileStream1)

  'Subscribe to the ByteProgression event

  AddHandler zipReader1.ByteProgression, AddressOf Of

    ZipReaderByteProgressionEventArgs

  'Subscribe to the InvalidPassword event

  AddHandler zipReader1.InvalidPassword, AddressOf Of

    ZipReaderInvalidPasswordEventArgs

  Dim zipItemLocalHeader As ZipItemLocalHeader = Nothing

  'Read the local headers until no more are found

  Do While Not (zipItemLocalHeader = zipReader1.ReadItemLocalHeader()) Is

  Nothing

    Dim buffer As Byte() = New Byte(1023){}

    Dim read As Integer = 0

    'Read the item's data

    Do While (read = zipReader1.ReadItemData(buffer, 0, buffer.Length)) > 0

      'Do something with the data in 'buffer'

    Loop

  Loop

End Using



'The InvalidPassword event's handler. Demonstrates the use of

'the properties of ZipReaderInvalidPasswordEventArgs.

Shared Sub zipReader1_InvalidPassword(ByVal sender As Object, ByVal e As

  ZipReaderInvalidPasswordEventArgs)

  Console.Write("Enter password for file {0} (<Enter> alone to abort): ",

    e.ZipItemLocalHeader.FileName)

  Dim password As String = Console.ReadLine()

  'Set Abort to true to abort the read operation.

  If String.IsNullOrEmpty(password) Then

    e.Abort = True

  Else

    'Set NewPassword to the provided password. If it is the correct password,

    'the read operation will proceed. Otherwise, the InvalidPassword event is

    'raised again.

    e.NewPassword = password

  End If

End Sub



'The ByteProgression event's handler. Demonstrates the use of

'the properties of ZipReaderByteProgressionEventArgs.

Shared Sub zipReader1_ByteProgression(ByVal sender As Object, ByVal e As

  ZipReaderByteProgressionEventArgs)

  If e.UncompressedSize = -1 Then

    Console.WriteLine("Processing item {0}: {1} bytes processed.",

      e.ZipItemLocalHeader.FileName, e.BytesProcessed)

  Else

    'UncompressedSize is not -1, so this property and the Percent

    'property return useful values.

    Console.WriteLine("Processing item {0}: {1} bytes processed

      ({3}%). (Uncompressed size = {3}.)",

      e.ZipItemLocalHeader.FileName,

      e.BytesProcessed, e.UncompressedSize, e.Percent)

  End If

End Sub