diff --git a/src/libraries/System.IO.Packaging/src/System/IO/Packaging/InterleavedZipPackagePartStream.cs b/src/libraries/System.IO.Packaging/src/System/IO/Packaging/InterleavedZipPackagePartStream.cs index 81a9a27209634c..82ec1f6a71200b 100644 --- a/src/libraries/System.IO.Packaging/src/System/IO/Packaging/InterleavedZipPackagePartStream.cs +++ b/src/libraries/System.IO.Packaging/src/System/IO/Packaging/InterleavedZipPackagePartStream.cs @@ -477,7 +477,6 @@ public override long Length get { CheckClosed(); - Debug.Assert(CanSeek); long length = 0; for (int pieceNumber = 0; pieceNumber < _dir.GetNumberOfPieces(); ++pieceNumber) diff --git a/src/libraries/System.IO.Packaging/tests/PartPieceTests.cs b/src/libraries/System.IO.Packaging/tests/PartPieceTests.cs index 36020afba48143..5069380acc6260 100644 --- a/src/libraries/System.IO.Packaging/tests/PartPieceTests.cs +++ b/src/libraries/System.IO.Packaging/tests/PartPieceTests.cs @@ -637,5 +637,21 @@ public void SetLengthRemovesPartPieces(string partName, int newLength, string re zipArchive.Dispose(); } + + [Fact] + public void InterleavedZipPackagePartStream_Length_ReturnsCorrectValueWhenCanSeekIsFalse() + { + using MemoryStream package = new(_partPieceSampleZipPackage); + + using Package zipPackage = Package.Open(package, FileMode.Open, FileAccess.Read); + PackagePart partEntry = zipPackage.GetPart(new Uri("/ReadablePartPieceEntry.bin", UriKind.Relative)); + using Stream stream = partEntry.GetStream(FileMode.Open); + + // When the package is opened with FileAccess.Read, the underlying zip entry stream + // does not support seeking but Length should still return the correct value. + // ReadablePartPieceEntry.bin has 4 pieces of 16 bytes each = 64 bytes total. + Assert.False(stream.CanSeek); + Assert.Equal(64, stream.Length); + } } }