/// <summary> /// Rewrite the directory within a zipfile. /// </summary> /// /// <remarks> /// /// <para> /// In cases of data error, the directory in a zip file can get out of /// synch with the entries in the zip file. This method attempts to fix /// the zip file if this has occurred. /// </para> /// /// <para> This can take a long time for large zip files. </para> /// /// <para> This won't work if the zip file uses a non-standard /// code page - neither IBM437 nor UTF-8. </para> /// /// <para> /// This method is not supported in the Reduced or Compact Framework /// versions of DotNetZip. /// </para> /// /// <para> /// Developers using COM can use the <see /// cref="ComHelper.FixZipDirectory(String)">ComHelper.FixZipDirectory(String)</see> /// method. /// </para> /// /// </remarks> /// /// <param name="zipFileName">The filename to of the zip file to fix.</param> /// /// <seealso cref="CheckZip(string)"/> /// <seealso cref="CheckZip(string,bool,System.IO.TextWriter)"/> public static void FixZipDirectory(string zipFileName) { using (var zip = new ZipFile()) { zip.FullScan = true; zip.Initialize(zipFileName); zip.Save(zipFileName); } }
/// <summary> /// Checks a zip file to see if its directory is consistent, /// and optionally fixes the directory if necessary. /// </summary> /// /// <remarks> /// /// <para> /// In cases of data error, the directory within a zip file can get out of /// synch with the entries in the zip file. This method checks the given /// zip file, and returns true if this has occurred. It also optionally /// fixes the zipfile, saving the fixed copy in <em>Name</em>_Fixed.zip. /// </para> /// /// <para> /// This method may take a long time to run for large zip files. It /// will take even longer if the file actually needs to be fixed, and if /// <c>fixIfNecessary</c> is true. /// </para> /// /// <para> /// This method is not supported in the Reduced or Compact /// Framework versions of DotNetZip. /// </para> /// /// </remarks> /// /// <param name="zipFileName">The filename to of the zip file to check.</param> /// /// <param name="fixIfNecessary">If true, the method will fix the zip file if /// necessary.</param> /// /// <param name="writer"> /// a TextWriter in which messages generated while checking will be written. /// </param> /// /// <returns>true if the named zip is OK; false if the file needs to be fixed.</returns> /// /// <seealso cref="CheckZip(string)"/> /// <seealso cref="FixZipDirectory(string)"/> public static bool CheckZip(string zipFileName, bool fixIfNecessary, TextWriter writer) { ZipFile zip1 = null, zip2 = null; bool isOk = true; try { zip1 = new ZipFile(); zip1.FullScan = true; zip1.Initialize(zipFileName); zip2 = ZipFile.Read(zipFileName); foreach (var e1 in zip1) { foreach (var e2 in zip2) { if (e1.FileName == e2.FileName) { if (e1._RelativeOffsetOfLocalHeader != e2._RelativeOffsetOfLocalHeader) { isOk = false; if (writer != null) { writer.WriteLine("{0}: mismatch in RelativeOffsetOfLocalHeader (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._RelativeOffsetOfLocalHeader, e2._RelativeOffsetOfLocalHeader); } } if (e1._CompressedSize != e2._CompressedSize) { isOk = false; if (writer != null) { writer.WriteLine("{0}: mismatch in CompressedSize (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._CompressedSize, e2._CompressedSize); } } if (e1._UncompressedSize != e2._UncompressedSize) { isOk = false; if (writer != null) { writer.WriteLine("{0}: mismatch in UncompressedSize (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._UncompressedSize, e2._UncompressedSize); } } if (e1.CompressionMethod != e2.CompressionMethod) { isOk = false; if (writer != null) { writer.WriteLine("{0}: mismatch in CompressionMethod (0x{1:X4} != 0x{2:X4})", e1.FileName, e1.CompressionMethod, e2.CompressionMethod); } } if (e1.Crc != e2.Crc) { isOk = false; if (writer != null) { writer.WriteLine("{0}: mismatch in Crc32 (0x{1:X4} != 0x{2:X4})", e1.FileName, e1.Crc, e2.Crc); } } // found a match, so stop the inside loop break; } } } zip2.Dispose(); zip2 = null; if (!isOk && fixIfNecessary) { string newFileName = Path.GetFileNameWithoutExtension(zipFileName); newFileName = System.String.Format("{0}_fixed.zip", newFileName); zip1.Save(newFileName); } } finally { if (zip1 != null) { zip1.Dispose(); } if (zip2 != null) { zip2.Dispose(); } } return(isOk); }
/// <summary> /// Checks a zip file to see if its directory is consistent, /// and optionally fixes the directory if necessary. /// </summary> /// /// <remarks> /// /// <para> /// In cases of data error, the directory within a zip file can get out of /// synch with the entries in the zip file. This method checks the given /// zip file, and returns true if this has occurred. It also optionally /// fixes the zipfile, saving the fixed copy in <em>Name</em>_Fixed.zip. /// </para> /// /// <para> /// This method may take a long time to run for large zip files. It /// will take even longer if the file actually needs to be fixed, and if /// <c>fixIfNecessary</c> is true. /// </para> /// /// <para> /// This method is not supported in the Reduced or Compact /// Framework versions of DotNetZip. /// </para> /// /// </remarks> /// /// <param name="zipFileName">The filename to of the zip file to check.</param> /// /// <param name="fixIfNecessary">If true, the method will fix the zip file if /// necessary.</param> /// /// <param name="writer"> /// a TextWriter in which messages generated while checking will be written. /// </param> /// /// <returns>true if the named zip is OK; false if the file needs to be fixed.</returns> /// /// <seealso cref="CheckZip(string)"/> /// <seealso cref="FixZipDirectory(string)"/> public static bool CheckZip(string zipFileName, bool fixIfNecessary, TextWriter writer) { ZipFile zip1 = null, zip2 = null; bool isOk = true; try { zip1 = new ZipFile(); zip1.FullScan = true; zip1.Initialize(zipFileName); zip2 = ZipFile.Read(zipFileName); foreach (var e1 in zip1) { foreach (var e2 in zip2) { if (e1.FileName == e2.FileName) { if (e1._RelativeOffsetOfLocalHeader != e2._RelativeOffsetOfLocalHeader) { isOk = false; if (writer != null) writer.WriteLine("{0}: mismatch in RelativeOffsetOfLocalHeader (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._RelativeOffsetOfLocalHeader, e2._RelativeOffsetOfLocalHeader); } if (e1._CompressedSize != e2._CompressedSize) { isOk = false; if (writer != null) writer.WriteLine("{0}: mismatch in CompressedSize (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._CompressedSize, e2._CompressedSize); } if (e1._UncompressedSize != e2._UncompressedSize) { isOk = false; if (writer != null) writer.WriteLine("{0}: mismatch in UncompressedSize (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._UncompressedSize, e2._UncompressedSize); } if (e1.CompressionMethod != e2.CompressionMethod) { isOk = false; if (writer != null) writer.WriteLine("{0}: mismatch in CompressionMethod (0x{1:X4} != 0x{2:X4})", e1.FileName, e1.CompressionMethod, e2.CompressionMethod); } if (e1.Crc != e2.Crc) { isOk = false; if (writer != null) writer.WriteLine("{0}: mismatch in Crc32 (0x{1:X4} != 0x{2:X4})", e1.FileName, e1.Crc, e2.Crc); } // found a match, so stop the inside loop break; } } } zip2.Dispose(); zip2 = null; if (!isOk && fixIfNecessary) { string newFileName = Path.GetFileNameWithoutExtension(zipFileName); newFileName = System.String.Format("{0}_fixed.zip", newFileName); zip1.Save(newFileName); } } finally { if (zip1 != null) zip1.Dispose(); if (zip2 != null) zip2.Dispose(); } return isOk; }
public void Error_ZipFile_Initialize_Error() { string notaZipFile = GetScript("VbsUnzip-ShellApp.vbs"); // try to read a bogus zip archive //Directory.SetCurrentDirectory(TopLevelDir); using (ZipFile zip1 = new ZipFile()) { zip1.Initialize(notaZipFile); } }
/// <summary> /// Checks a zip file to see if its directory is consistent, /// and optionally fixes the directory if necessary. /// </summary> /// /// <remarks> /// /// <para> In cases of data error, the directory within a zip file can get out of /// synch with the entries in the zip file. This method checks the given /// zip file, and returns true if this has occurred. It also optionally /// fixes the zipfile, saving the fixed copy in <em>Name</em>_Fixed.zip.</para> /// /// <para> This method may take a long time to run for large zip files. It will /// take even longer if the file actually needs to be fixed, and if /// <c>fixIfNecessary</c> is true. </para> /// /// <para> /// This method is not supported in the Reduced or Compact /// Framework versions of DotNetZip. /// </para> /// /// </remarks> /// /// <param name="zipFileName">The filename to of the zip file to check.</param> /// /// <param name="fixIfNecessary">If true, the method will fix the zip file if /// necessary.</param> /// /// <param name="messages"> /// a collection of messages generated while checking, indicating any problems that are found. /// </param> /// /// <returns>true if the named zip is OK; false if the file needs to be fixed.</returns> /// /// <seealso cref="CheckZip(string)"/> /// <seealso cref="FixZipDirectory(string)"/> public static bool CheckZip(string zipFileName, bool fixIfNecessary, out System.Collections.ObjectModel.ReadOnlyCollection <String> messages) { List <String> notes = new List <String>(); ZipFile zip1 = null; ZipFile zip2 = null; bool isOk = true; try { zip1 = new ZipFile(); zip1.FullScan = true; zip1.Initialize(zipFileName); zip2 = ZipFile.Read(zipFileName); foreach (var e1 in zip1) { foreach (var e2 in zip2) { if (e1.FileName == e2.FileName) { if (e1._RelativeOffsetOfLocalHeader != e2._RelativeOffsetOfLocalHeader) { isOk = false; notes.Add(String.Format("{0}: mismatch in RelativeOffsetOfLocalHeader (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._RelativeOffsetOfLocalHeader, e2._RelativeOffsetOfLocalHeader)); } if (e1._CompressedSize != e2._CompressedSize) { isOk = false; notes.Add(String.Format("{0}: mismatch in CompressedSize (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._CompressedSize, e2._CompressedSize)); } if (e1._UncompressedSize != e2._UncompressedSize) { isOk = false; notes.Add(String.Format("{0}: mismatch in UncompressedSize (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._UncompressedSize, e2._UncompressedSize)); } if (e1.CompressionMethod != e2.CompressionMethod) { isOk = false; notes.Add(String.Format("{0}: mismatch in CompressionMethod (0x{1:X4} != 0x{2:X4})", e1.FileName, e1.CompressionMethod, e2.CompressionMethod)); } if (e1.Crc != e2.Crc) { isOk = false; notes.Add(String.Format("{0}: mismatch in Crc32 (0x{1:X4} != 0x{2:X4})", e1.FileName, e1.Crc, e2.Crc)); } // found a match, so stop the inside loop break; } } } zip2.Dispose(); zip2 = null; if (!isOk && fixIfNecessary) { string newFileName = Path.GetFileNameWithoutExtension(zipFileName); newFileName = System.String.Format("{0}_fixed.zip", newFileName); zip1.Save(newFileName); } } finally { if (zip1 != null) { zip1.Dispose(); } if (zip2 != null) { zip2.Dispose(); } } messages = notes.AsReadOnly(); // may or may not be empty return(isOk); }
/// <summary> /// Checks a zip file to see if its directory is consistent, /// and optionally fixes the directory if necessary. /// </summary> /// /// <remarks> /// /// <para> /// In cases of data error, the directory within a zip file can get out of /// synch with the entries in the zip file. This method checks the given /// zip file, and returns true if this has occurred. It also optionally /// fixes the zipfile, saving the fixed copy in <em>Name</em>_Fixed.zip. /// </para> /// /// <para> /// This method may take a long time to run for large zip files. It /// will take even longer if the file actually needs to be fixed, and if /// <c>fixIfNecessary</c> is true. /// </para> /// /// <para> /// This method is not supported in the Reduced or Compact /// Framework versions of DotNetZip. /// </para> /// /// </remarks> /// /// <param name="zipFileName">The filename to of the zip file to check.</param> /// /// <param name="fixIfNecessary">If true, the method will fix the zip file if /// necessary.</param> /// /// <param name="messages"> /// a collection of messages generated while checking, indicating any problems that are found. /// </param> /// /// <returns>true if the named zip is OK; false if the file needs to be fixed.</returns> /// /// <seealso cref="CheckZip(string)"/> /// <seealso cref="FixZipDirectory(string)"/> public static bool CheckZip(string zipFileName, bool fixIfNecessary, out System.Collections.ObjectModel.ReadOnlyCollection<String> messages) { List<String> notes = new List<String>(); ZipFile zip1 = null; ZipFile zip2 = null; bool isOk = true; try { zip1 = new ZipFile(); zip1.FullScan = true; zip1.Initialize(zipFileName); zip2 = ZipFile.Read(zipFileName); foreach (var e1 in zip1) { foreach (var e2 in zip2) { if (e1.FileName == e2.FileName) { if (e1._RelativeOffsetOfLocalHeader != e2._RelativeOffsetOfLocalHeader) { isOk = false; notes.Add(String.Format("{0}: mismatch in RelativeOffsetOfLocalHeader (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._RelativeOffsetOfLocalHeader, e2._RelativeOffsetOfLocalHeader)); } if (e1._CompressedSize != e2._CompressedSize) { isOk = false; notes.Add(String.Format("{0}: mismatch in CompressedSize (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._CompressedSize, e2._CompressedSize)); } if (e1._UncompressedSize != e2._UncompressedSize) { isOk = false; notes.Add(String.Format("{0}: mismatch in UncompressedSize (0x{1:X16} != 0x{2:X16})", e1.FileName, e1._UncompressedSize, e2._UncompressedSize)); } if (e1.CompressionMethod != e2.CompressionMethod) { isOk = false; notes.Add(String.Format("{0}: mismatch in CompressionMethod (0x{1:X4} != 0x{2:X4})", e1.FileName, e1.CompressionMethod, e2.CompressionMethod)); } if (e1.Crc != e2.Crc) { isOk = false; notes.Add(String.Format("{0}: mismatch in Crc32 (0x{1:X4} != 0x{2:X4})", e1.FileName, e1.Crc, e2.Crc)); } // found a match, so stop the inside loop break; } } } zip2.Dispose(); zip2 = null; if (!isOk && fixIfNecessary) { string newFileName = Path.GetFileNameWithoutExtension(zipFileName); newFileName = System.String.Format("{0}_fixed.zip", newFileName); zip1.Save(newFileName); } } finally { if (zip1 != null) zip1.Dispose(); if (zip2 != null) zip2.Dispose(); } messages = notes.AsReadOnly(); // may or may not be empty return isOk; }
public static ZipFile ReadZipFile(string filename) { var zip = new ZipFile (new System.Text.UTF8Encoding (false)); zip.CaseSensitiveRetrieval = true; zip.Initialize (filename); return zip; }