}
}
- [Test]
- public void ZipGetArchiveEntryStreamLengthPositionReadMode()
+ public void ZipGetArchiveEntryStreamLengthPosition(ZipArchiveMode mode)
{
- using (var archive = new ZipArchive(File.Open("test.nupkg", FileMode.Open),
- ZipArchiveMode.Read))
+ File.Copy("test.nupkg", "test2.nupkg", overwrite: true);
+ using (var archive = new ZipArchive(File.Open("test2.nupkg", FileMode.Open), mode))
{
var entry = archive.GetEntry("_rels/.rels");
using (var stream = entry.Open())
Assert.AreEqual(0, stream.Position);
Assert.AreEqual(425, stream.Length);
}
+
+ // .NET does not support these in Read mode but we do.
+ var entry2 = archive.GetEntry("modernhttpclient.nuspec");
+ using (var stream = entry2.Open())
+ {
+ Assert.AreEqual(857, stream.Length);
+ if (mode == ZipArchiveMode.Update)
+ {
+ Assert.AreEqual(0, stream.Position);
+ }
+ }
}
+ File.Delete ("test2.nupkg");
}
+ [Test]
+ public void ZipGetArchiveEntryStreamLengthPositionReadMode()
+ {
+ ZipGetArchiveEntryStreamLengthPosition(ZipArchiveMode.Read);
+ }
+
+ [Test]
+ public void ZipGetArchiveEntryStreamLengthPositionUpdateMode()
+ {
+ ZipGetArchiveEntryStreamLengthPosition(ZipArchiveMode.Update);
+ }
+
[Test]
public void ZipEnumerateEntriesReadMode()
{
public override long Length {
get {
- return stream.Length;
+ return stream.CanWrite ? stream.Length : entry.Length;
}
}
public override void Write (byte[] buffer, int offset, int count)
{
- if (entry.Archive.Mode == ZipArchiveMode.Update && !entry.wasWritten)
+ stream.Write(buffer, offset, count);
+ }
+
+ internal void EnsureWriteable()
+ {
+ if (entry.Archive.Mode == ZipArchiveMode.Update && !stream.CanWrite)
{
// Replace the read-only stream with a writeable memory stream.
- if (!stream.CanWrite)
- SetWriteable();
- entry.wasWritten = true;
+ SetWriteable();
}
-
- stream.Write(buffer, offset, count);
}
internal void SetWriteable()
var newStream = newEntry.OpenEntryStream();
var openStream = stream;
- var position = openStream.Position;
-
- entry.openStream = null;
- entry.Open();
-
openStream.CopyTo(newStream);
- newStream.Position = position;
openStream.Dispose();
+ newStream.Position = 0;
+
archive.zipFile.RemoveEntry(internalEntry);
entry.entry = newEntry;
stream = newStream;
var entryStream = entry.OpenEntryStream();
openStream = new ZipArchiveEntryStream(this, entryStream);
+ openStream.EnsureWriteable();
return openStream;
}