diff --git a/src/ICSharpCode.SharpZipLib/Checksum/BZip2Crc.cs b/src/ICSharpCode.SharpZipLib/Checksum/BZip2Crc.cs index aac3075b6..9674dcec7 100644 --- a/src/ICSharpCode.SharpZipLib/Checksum/BZip2Crc.cs +++ b/src/ICSharpCode.SharpZipLib/Checksum/BZip2Crc.cs @@ -177,10 +177,11 @@ public void Update(byte[] buffer) /// public void Update(ArraySegment segment) { - foreach (byte b in segment) - { - Update(b); - } + var count = segment.Count; + var offset = segment.Offset; + + while (--count >= 0) + Update(segment.Array[offset++]); } } } diff --git a/src/ICSharpCode.SharpZipLib/Checksum/Crc32.cs b/src/ICSharpCode.SharpZipLib/Checksum/Crc32.cs index f9861685a..9b8ab4b6d 100644 --- a/src/ICSharpCode.SharpZipLib/Checksum/Crc32.cs +++ b/src/ICSharpCode.SharpZipLib/Checksum/Crc32.cs @@ -166,10 +166,11 @@ public void Update(byte[] buffer) /// public void Update(ArraySegment segment) { - foreach (byte b in segment) - { - Update(b); - } + var count = segment.Count; + var offset = segment.Offset; + + while (--count >= 0) + Update(segment.Array[offset++]); } } } diff --git a/src/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.csproj b/src/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.csproj index 31aabaf1c..1114826b4 100644 --- a/src/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.csproj +++ b/src/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.csproj @@ -17,16 +17,15 @@ ICSharpCode ICSharpCode SharpZipLib (#ziplib, formerly NZipLib) is a compression library for Zip, GZip, BZip2, and Tar written entirely in C# for .NET. It is implemented as an assembly (installable in the GAC), and thus can easily be incorporated into other projects (in any .NET language) - https://github.com/icsharpcode/SharpZipLib/raw/master/LICENSE.txt - http://icsharpcode.github.io/SharpZipLib/ - http://icsharpcode.github.io/SharpZipLib/assets/sharpziplib-nuget-256x256.png + MIT + http://icsharpcode.github.io/SharpZipLib/ + http://icsharpcode.github.io/SharpZipLib/assets/sharpziplib-nuget-256x256.png https://github.com/icsharpcode/SharpZipLib Copyright © 2000-2018 SharpZipLib Contributors Compression Library Zip GZip BZip2 LZW Tar en-US Please see https://github.com/icsharpcode/SharpZipLib/wiki/Release-1.1 for more information. - https://github.com/icsharpcode/SharpZipLib/blob/master/LICENSE.txt https://github.com/icsharpcode/SharpZipLib diff --git a/src/ICSharpCode.SharpZipLib/Zip/ZipFile.cs b/src/ICSharpCode.SharpZipLib/Zip/ZipFile.cs index 778abfd15..fa4c09401 100644 --- a/src/ICSharpCode.SharpZipLib/Zip/ZipFile.cs +++ b/src/ICSharpCode.SharpZipLib/Zip/ZipFile.cs @@ -2461,7 +2461,9 @@ private void CopyEntryDataDirect(ZipUpdate update, Stream stream, bool updateCrc private int FindExistingUpdate(ZipEntry entry) { int result = -1; - string convertedName = GetTransformedFileName(entry.Name); + string convertedName = entry.IsDirectory + ? GetTransformedDirectoryName(entry.Name) + : GetTransformedFileName(entry.Name); if (updateIndex_.ContainsKey(convertedName)) { diff --git a/test/ICSharpCode.SharpZipLib.Tests/Zip/ZipFileHandling.cs b/test/ICSharpCode.SharpZipLib.Tests/Zip/ZipFileHandling.cs index 9496938e8..6cbcfd824 100644 --- a/test/ICSharpCode.SharpZipLib.Tests/Zip/ZipFileHandling.cs +++ b/test/ICSharpCode.SharpZipLib.Tests/Zip/ZipFileHandling.cs @@ -403,6 +403,8 @@ public void AddAndDeleteEntries() string addFile2 = Path.Combine(tempFile, "b.dat"); MakeTempFile(addFile2, 259); + string addDirectory = Path.Combine(tempFile, "dir"); + tempFile = Path.Combine(tempFile, "SharpZipTest.Zip"); using (ZipFile f = ZipFile.Create(tempFile)) @@ -410,17 +412,27 @@ public void AddAndDeleteEntries() f.BeginUpdate(); f.Add(addFile); f.Add(addFile2); + f.AddDirectory(addDirectory); f.CommitUpdate(); Assert.IsTrue(f.TestArchive(true)); } using (ZipFile f = new ZipFile(tempFile)) { - Assert.AreEqual(2, f.Count); + Assert.AreEqual(3, f.Count); Assert.IsTrue(f.TestArchive(true)); + + // Delete file f.BeginUpdate(); f.Delete(f[0]); f.CommitUpdate(); + Assert.AreEqual(2, f.Count); + Assert.IsTrue(f.TestArchive(true)); + + // Delete directory + f.BeginUpdate(); + f.Delete(f[1]); + f.CommitUpdate(); Assert.AreEqual(1, f.Count); Assert.IsTrue(f.TestArchive(true)); }