More .NET libraries
-
Rebex Total Pack
All Rebex .NET libraries together
Back to feature list...
ZipReader class
On this page:
ZipReader basics
ZipReader
class makes it possible to process ZIP archives sequentially.
This is useful when working with non-seekable streams, such as ZIP files streamed
from the Internet, and iterate through ZIP items or extract them on-the-fly.
Additionally, ZipReader
can process incomplete ZIP archives (for example
due to interrupted download) that lack the central directory
structure, located at the end of a ZIP archive).
ZipReader
is more efficient than our easy-to-use API
(the ZipArchive
class), because it does not have to parse the central directory
in advance and keep it in memory. ZipReader
is not as simple to use
- but it targets scenarios that ZipArchive
cannot handle.
To iterate through a ZIP file using ZipReader
, use ReadNext()
method:
// initialize ZipReader from a (possibly non-seekable) stream using (var reader = new ZipReader(stream)) { // iterate through all items in the ZIP archive while (reader.ReadNext()) { // do something... } }
ZipReader properties
Use ZipReader.ReadNext()
method to iterate through the ZIP archive
sequentially. When it returns true
, it indiates that it has
advanced to a new ZIP item, and properties on ZipReader
class
are populated to provide information about it.
For example, use this code to list ZIP archive contents:
// initialize ZipReader from a (possibly non-seekable) stream using (var reader = new ZipReader(stream)) { // iterate through the ZIP archive and list all items while (reader.ReadNext()) { // get item type string type = "?"; switch (reader.ItemType) { case ArchiveItemType.File: type = "-"; break; case ArchiveItemType.Directory: type = "d"; break; case ArchiveItemType.Link: type = "l"; break; } // get last modification date string modified; if (reader.LastWriteTime.HasValue) { modified = reader.LastWriteTime.Value.ToString("yyyy-MM-dd"); } else { modified = "????-??-??"; } // print info about currently processing ZIP item Console.WriteLine("{0}\t{1}\t{2}\t{3}", type, modified, reader.Length, reader.Path); } }
Extracting using ZipReader
To extract data from a ZIP archive using ZipReader
class,
iterate through its items and use ZipReader.Extract()
method
to uncompress them:
// open an incomplete ZIP archive using (var reader = new ZipReader(@"C:\MyData\incomplete-archive.zip")) { // specify output directory string outputPath = @"C:\MyData\Out"; // iterate through all items while (reader.ReadNext()) { // skip directories if (reader.IsDirectory) continue; if (reader.CanExtract) { try { // try to extract the item reader.Extract(Path.Combine(outputPath, reader.Path)); Console.WriteLine("Extracted '{0}'.", reader.Path); } catch (ZipException ex) { // handle errors (such as incomplete last item) Console.WriteLine("Cannot extract item '{0}': {1}", reader.Path, ex.Message); } } else { // report error for unsupported items Console.WriteLine("Cannot extract item '{0}'.", reader.Path); } } }
Back to feature list...